当前位置: 首页 > 知识库问答 >
问题:

双精度、逗号和点

祁修诚
2023-03-14

我正在制作一个AndroidJava程序,它从用户那里获得双倍的值。如果我在电脑上运行这个程序,它会很好地工作,因为我的电脑的语言环境,EN_UK。但是当我在手机上用FI_FI语言环境运行它时,它就不起作用了。我知道原因:在英国,人们用点作为十进制分隔符,但是在芬兰,十进制分隔符是逗号。

DecimalFormat df = new DecimalFormat("#.#");
Double returnValue = Double.valueOf(df.format(doubleNumber));

当我使用逗号时,它说java.lang.NumberFormat异常:无效的双倍:"1234,5"

我怎样才能同时使用逗号和圆点呢?

共有3个答案

黄骏喆
2023-03-14

这应该适用于Java(测试)以及Android:)

>

  • 类名称:In18Helper.java

    package com.akmeher.app.utils;
    
    import java.text.NumberFormat;
    import java.text.ParseException;
    import java.util.Locale;
    
    public class In18Helper {
        private final static In18Helper mHelper = new In18Helper();
    
        public static final In18Helper getInstance() {
            return mHelper;
        }
    
        public double getDouble(String sValue, Locale locale) {
            NumberFormat numberFormat = NumberFormat.getInstance(locale);
    
            Number parse = null;
            try {
                parse = numberFormat.parse(sValue);
            } catch (ParseException e) {
                e.printStackTrace();
            }
    
            return parse == null ? 0 : parse.doubleValue();
        }
    
    }
    

    班级名称:pplication.java

    package com.akmeher.app;
    
    import java.util.Locale;
    import com.akmeher.app.utils.In18Helper;
    
    public class Application {
    
        static DataModel[] testData = new DataModel[] {
                new DataModel("1.034567", Locale.ENGLISH),
                new DataModel("1,0345.67", Locale.ENGLISH),
                new DataModel("1.0345,67", Locale.GERMANY),
                new DataModel("1,034,567", Locale.CANADA),
                new DataModel("1.034567", Locale.KOREA),
                new DataModel("1,03.4567", Locale.ITALY) };
    
        /**
         * @param args
         */
        public static void main(String[] args) {
    
            for (int i = 0; i < testData.length; i++) {
                        double d = In18Helper.getInstance().getDouble(testData[i].mValue,
                        testData[i].mLocale);
    
                System.out.println("Trial Value: "+testData[i].mValue+" for Locale: "+testData[i].mLocale+" converted to: "+d);
            }
        }
    
        private static class DataModel {
            String mValue;
            Locale mLocale;
    
            public DataModel(String value, Locale locale) {
                this.mLocale = locale;
                this.mValue = value;
            }
        }
    }
    

    输出:

    试用值:1.034567区域设置:en转换为:1.034567试用值:1,0345.67区域设置:en转换为:10345.67试用值:1.0345,67区域设置:de_DE转换为:10345.67试用值:1,034,567区域设置:en_CA转换为:1034567.0试用值:1.034567区域设置:ko_KR转换为:1.034567试用值:1,03.4567区域设置:it_IT转换为:1.03

    希望这能帮助别人利用。

  • 宓博实
    2023-03-14

    使用十进制符号。getInstance()将生成默认语言环境的正确符号,因此您可以在任何平台上运行它。

    DecimalFormat df = new DecimalFormat("#.#", DecimalFormatSymbols.getInstance());
    
    督德泽
    2023-03-14

    使用DecimalFormata的其他构造函数之一:

    new DecimalFormat("#.#", new DecimalFormatSymbols(Locale.US))
    

    然后尝试使用两个分隔符来解析它。

     类似资料:
    • 问题内容: 我正在制作一个Android Java程序,该程序从用户处获取双倍值。如果我在计算机上运行该程序,则由于我的计算机的语言环境为EN_UK,因此运行良好。但是,当我在具有FI_FI语言环境的手机上运行它时,它将无法工作。我知道原因:在英国,人们使用点作为小数点分隔符,但在芬兰,小数点分隔符是逗号。 当我使用逗号时,它说。 如何使它们与逗号和点都兼容? 问题答案: 使用DecimalFor

    • 问题内容: 我想知道为什么会出现此错误。(这是Eclipse调试的显示日志) 我不明白为什么我没有得到2.97! 问题答案: 如果需要,您应该已经习惯了。 s以分数形式存储在 二进制 而不是十进制中。因此,例如,仅存储为。 并且不能精确地表示为二进制分数,因此会有一些舍入误差。 您可能还会发现本文很有帮助。

    • 问题内容: java中双值的乘法运算符的保证精度是多少? 例如,2.2 * 100是220.00000000000003,但是220是双精度数。220.00000000000003是220之后的下一个两倍。 问题答案: 乘法工作正常,但不能精确表示为双精度。最接近的双打是: 2.199999999999999733(0x4001999999999999) 2.200000000000000177(

    • 我不明白为什么浮点值与双精度值不同。从下面的示例来看,对于相同的操作,float 提供的结果似乎与双精度型不同: 输出: 你能解释一下float和double之间的区别吗?

    • 嗨,我最近看到了一个类似这样的问题 在我回答了这个问题后,事实证明我弄错了,我回答了整数。MIN_VALUE但正确的答案是整数。MAX_VALUE。经过进一步的测试,我意识到我对大于整数的int施加的任何双精度。MAX_VALUE只是使int等于整数。MAX_VALUE。例如 经过进一步的测试,我意识到如果你试图将long转换为int,似乎会将int分配给一个看似随机的数字。 所以我的问题是。到底

    • 我想用一个小数点和一个小数位的格式将任何双精度四舍五入为双精度,这样29575.347434将是2.3。 我试着用decimalFormat做这个,但当我试着我只得到了一个29575.3格式的字符串,带有一个,我不知道如何在保留值为双精度的同时去掉所有小数点。