Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java十进制格式-与给定的精度相同_Java_Parsing_Format_Decimal - Fatal编程技术网

Java十进制格式-与给定的精度相同

Java十进制格式-与给定的精度相同,java,parsing,format,decimal,Java,Parsing,Format,Decimal,我使用的是DecimalFormat,我希望能够以给定的精度读取和写入小数(我正在转换为BigDecimal) 基本上,我需要一个十进制格式,它强制执行以下模式“\d+(\.\d+)”,即“至少一个数字,然后可选地,一个十进制分隔符后跟至少一个数字” 我正在努力使用DecimalFormat实现这一点,我尝试了几种模式,但它们似乎强制使用固定的位数 我对实现这一目标的其他方法也持开放态度 编辑: 为了了解更多的背景信息,我正在解析用户提供的数据,其中小数可以以任何方式进行格式化,也可能不采用区域

我使用的是
DecimalFormat
,我希望能够以给定的精度读取和写入小数(我正在转换为
BigDecimal

基本上,我需要一个
十进制格式
,它强制执行以下模式“\d+(\.\d+)”,即“至少一个数字,然后可选地,一个十进制分隔符后跟至少一个数字”

我正在努力使用
DecimalFormat
实现这一点,我尝试了几种模式,但它们似乎强制使用固定的位数

我对实现这一目标的其他方法也持开放态度

编辑:


为了了解更多的背景信息,我正在解析用户提供的数据,其中小数可以以任何方式进行格式化,也可能不采用区域设置格式。我希望他们能提供一个十进制格式的字符串,我可以用它来解析数据

这似乎很有效:

public static void main(String[] args) throws Exception{
    DecimalFormat f = new DecimalFormat("0.#");
    f.setParseBigDecimal(true);
    f.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.US));// if required


    System.out.println(f.parse("1.0"));   // 1.0
    System.out.println(f.parse("1"));     // 1
    System.out.println(f.parse("1.1"));   // 1.1
    System.out.println(f.parse("1.123")); // 1.123
    System.out.println(f.parse("1."));    // 1
    System.out.println(f.parse(".01"));   // 0.01
}

除了最后两个违反“至少一位数”要求的数字。如果真的很重要,您可能必须使用正则表达式单独检查它。

因为您在注释中指出需要区域设置支持:

Locale locale = //get this from somewhere else
DecimalFormat df = new DecimalFormat();
df.setDecimalFormatSymbols(new DecimalFormatSymbols(locale));
df.setMaximumFractionDigits(Integer.MAX_VALUE);
df.setMinimumFractionDigits(1);
df.setParseBigDecimal(true);

然后解析。

但是,当我试图写出一个十进制数-
f.format(3.14)//3.1
,理想情况下这也会输出
3.14
-有什么方法可以这样做吗?嗯,只需根据您需要的精度使模式变长(例如
new DecimalFormat(“0.##”)
)。在您的例子中,还可以使用默认的DecimalFormat构造函数。有趣的是,当我试图解析一个无效的数字时,调用
df.toLocalizedPattern()
导致了
java.lang.OutOfMemoryError
.a),这很奇怪。可能是个虫子?b) 为什么要创建本地化图案。您不直接使用format实例进行解析吗?仅用于错误报告,它会传递给异常的构造函数。非常感谢。android中的EditText有问题,我格式化了我的double(删除了E编号),所以我必须重新格式化它。