如何在UWP的NumberBox中使用PercentFormatter避免末尾多余零?
UWP NumberBox 百分比显示多余末尾零的解决方法
问题原因
PercentFormatter 默认遵循标准百分比换算逻辑:输入数值 * 100 后拼接 % 后缀,你直接传入数值75的话,内部换算后为75*100=7500%。同时你设置的IntegerDigits = 1是指定整数部分的最小显示位数,而非最大,因此四位整数7500会完整显示,最终出现多余末尾零。
解决方案
方案1:适配PercentFormatter默认规则
无需自定义格式化类,只需将传入的数值缩小100倍,匹配1对应100%的换算规则即可:
double number = 75; NumberBox numberBox = new NumberBox(); PercentFormatter percentFormatter = new PercentFormatter(); // 设置小数位数为0,不需要额外指定IntegerDigits percentFormatter.FractionDigits = 0; numberBox.NumberFormatter = percentFormatter; // 数值除以100适配换算逻辑,0.75对应75% numberBox.Value = number / 100; // 若要限制0%-100%范围,添加以下配置 numberBox.Minimum = 0; numberBox.Maximum = 1;
方案2:自定义格式化类(无需修改传入数值)
如果不想改动原有数值逻辑,可以自己实现INumberFormatter接口,直接拼接%后缀,跳过自动乘100的逻辑:
首先实现自定义格式化类:
public class CustomPercentFormatter : INumberFormatter, INumberParser { // 格式化逻辑:直接取整数部分拼接% public string FormatDouble(double value) { return $"{value:0}%"; } // 解析逻辑:适配NumberBox输入,去掉%后转数值 public IReference<double> ParseDouble(string text) { if (text.EndsWith("%")) text = text.TrimEnd('%').Trim(); if (double.TryParse(text, out double result)) return result; return null; } // 以下接口方法若无特殊需求可直接实现对应逻辑,NumberBox仅用Double相关方法即可正常运行 public string FormatInt(long value) => $"{value}%"; public string FormatUInt(ulong value) => $"{value}%"; public IReference<long> ParseInt(string text) => throw new NotImplementedException(); public IReference<ulong> ParseUInt(string text) => throw new NotImplementedException(); }
调用方式:
double number = 75; NumberBox numberBox = new NumberBox(); numberBox.NumberFormatter = new CustomPercentFormatter(); numberBox.Value = number; // 若要限制0%-100%范围,添加以下配置 numberBox.Minimum = 0; numberBox.Maximum = 100;
内容的提问来源于stack exchange,提问作者PremKumar Shanmugam
相关产品推荐
相关产品推荐

