如何修改掩码Decimal输入转换器代码以支持负值输入?
修改后的Converter类代码
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { // 原有逻辑无需改动,负数会自动保留负号并格式化为两位小数 return Decimal.Parse(value.ToString()).ToString("#0.00"); } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { string input = value.ToString().Trim(); // 标记输入是否为负数(仅识别开头的负号) bool isNegative = input.StartsWith("-"); // 提取所有数字字符,非数字内容全部移除 string valueFromString = Regex.Replace(input, @"\D", ""); if (valueFromString.Length <= 0) return 0m; long valueLong; if (!long.TryParse(valueFromString, out valueLong)) return 0m; // 计算基础数值后,根据标记添加负号 decimal result = valueLong / 100m; return isNegative ? -result : result; }
修改要点
- 保留负号信息:先判断输入是否以负号开头,用变量记录状态,避免正则把负号当成非数字移除
- 取消正数限制:删掉了原代码里
if (valueLong <= 0) return 0m;的判断,允许0和负数正常转换 - 结果补全符号:计算出基础的十进制值后,根据之前的标记给结果加上负号
可选优化:处理多负号场景
如果需要支持类似--123(视为正数)、---123(视为负数)的输入,可以把负号判断改成统计次数:
// 统计输入中负号的总数,奇数次为负,偶数次为正 int negativeCount = input.Count(c => c == '-'); bool isNegative = negativeCount % 2 == 1;
内容的提问来源于stack exchange,提问作者trex213939
相关产品推荐
相关产品推荐

