如何适配不同区域分隔符,获取价格字段分隔符后的数字位数?
你现有代码的核心问题是硬编码逗号作为唯一小数分隔符,不同国家/区域的小数分隔符可能是点、逗号等,还有部分区域会用逗号做千位分隔符、点做小数分隔符,会直接导致原有逻辑判断错误。
最优解决方案如下:
- 优先使用系统自带的区域感知数值解析能力,不要手动检索分隔符
你当前使用的是Dynamics 365 FO的X++语法,可以直接调用.NET的全球化类获取对应区域的小数分隔符,同时规避千位分隔符的干扰,修正后代码如下:
str strSalesPrice = conPeek(record,5); System.Globalization.CultureInfo cultureInfo; System.Globalization.NumberFormatInfo numberFormat; System.Decimal salesPriceDecimal; int decimalDigits; // 取当前系统的区域配置用这句 cultureInfo = new System.Globalization.CultureInfo(System.Globalization.CultureInfo::CurrentCulture.Name); // 如果是指定区域的价格输入,就指定对应区域代码,例如美国区:new System.Globalization.CultureInfo("en-US"); numberFormat = cultureInfo.get_NumberFormat(); // 先尝试把字符串转为decimal,过滤非法字符、规避千位分隔符干扰 if (System.Decimal::TryParse(strSalesPrice, System.Globalization.NumberStyles::Number, numberFormat, salesPriceDecimal)) { // 提取小数位长度 System.String priceStr = salesPriceDecimal.ToString("0." + strRep("0", SalesParameters.DfcDigitSize + 1), numberFormat); int delimiterPos = strFind(priceStr, numberFormat.NumberDecimalSeparator, 1, strLen(priceStr)); if (delimiterPos != 0) { decimalDigits = strLen(subStr(priceStr, delimiterPos + 1, strLen(priceStr))); if (decimalDigits > SalesParameters.DfcDigitSize) { throw error("请检查价格的小数位长度是否符合要求"); } } } else { throw error("输入的价格格式不合法,请检查"); }
- 如果你的场景不允许转成数值类型,必须直接处理原始字符串,可以先获取目标区域的小数分隔符和千位分隔符,先把千位分隔符从原始字符串里删除,再检索小数分隔符的位置,避免千位分隔符和小数分隔符符号重合的区域出现判断错误。
内容的提问来源于stack exchange,提问作者yalcinpkr
相关产品推荐
相关产品推荐

