gpt4 book ai didi

java - java 中非默认语言环境的 NumberFormat 解析不正确

转载 作者:行者123 更新时间:2023-12-02 12:10:39 26 4
gpt4 key购买 nike

NumberFormat 错误地解析默认 en_US 以外的区域设置的数字。例如,解析 fr_CA 会给出不正确的结果。

NumberFormat nf = NumberFormat.getNumberInstance(new Locale("fr_CA"));
Number num = nf.parse("2.302,52");

输出为:2.302

预期输出:2302,522302.52

它基本上是将这个数字的值从 2000 左右更改为 2 左右,这是不正确的。

详细信息请参见下面的屏幕截图: enter image description here

我无法确定出了什么问题,请帮忙!

最佳答案

编辑 1:

通过将小数和分组分隔符设置为:

,我能够使用 DecimalFormat 正确解析非默认区域设置值:
        /**
* Testing DF parse
*/
DecimalFormat df = new DecimalFormat();
DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setDecimalSeparator(',');
symbols.setGroupingSeparator('.');
df.setDecimalFormatSymbols(symbols);
Number num = df.parse("2.302,52"); // OUTPUT is: 2302.52 -> correctly parsed

/**
* Round off and format
*/
double d = num.doubleValue();
double roundedVal = Math.round(d); // OUTPUT is: 2303.0 -> correctly rounded off
String localeAwareVlue = df.format(roundedVal); // OUTPUT is: 2.303 -> using correct grouping separator
valueString = localeAwareVlue;

但我真的希望能够在运行时动态地执行此操作,而不必为我可能收到的每种语言/国家/地区组合设置分隔符。有什么建议请帮忙。

编辑 2:

我最终得到了以下最终代码,以便能够动态解析和格式化本地化值。这适用于像 ###,###.## 和 ###.###,## 这样的模式 - 假设是 -

  1. 接收到的数据始终只有 2 位小数
  2. 小数分隔符可以是逗号或句点
  3. 分组分隔符是句点或逗号

    String localValue = args.get(0).toString();
    // String locale = args.get(1).toString();

    char decChar = localValue.charAt(localValue.length()-3);
    char grpChar = ',';
    if(decChar == ',') {
    grpChar = '.';
    }
    DecimalFormat df = new DecimalFormat();
    DecimalFormatSymbols symbols = new DecimalFormatSymbols();
    symbols.setDecimalSeparator(decChar);
    symbols.setGroupingSeparator(grpChar);
    df.setDecimalFormatSymbols(symbols);

    Number parsedValue = 0;
    try {
    parsedValue = df.parse(localValue);
    }
    catch (ParseException pe) {
    pe.printStackTrace();
    }

    /**
    * Round off and format to localize
    */
    double roundedValue = Math.round(parsedValue.doubleValue());
    String localeAwareValue = df.format(roundedValue);


    // TODO - use Locale with nf instead of above method
    // currently facing issue with incorrect parse for non default locale
    /*
    NumberFormat nf = NumberFormat.getInstance(new Locale(locale));
    Number num = nf.parse(localValue);
    */

不用说,我对这个解决方案并不满意,这更像是一种解决方法,直到我找到主要问题的解决方案 - NumberFormat 对非默认区域设置的解析不正确。因此,任何提示、建议、解决方案仍然受欢迎。

关于java - java 中非默认语言环境的 NumberFormat 解析不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46578360/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com