如何解析负数字符串?
字符串可能具有以下形式:
-123.23
(123.23)
123.23-
是否有一个类可以将上述任何字符串转换为数字?
如果没有,最好的方法是什么?
在 WarrenFaiths 答案的基础上,您可以添加以下内容:
Double newNumber = 0;
if(number.charAt(i).isDigit()){
//parse numeber here using WarrenFaiths method and place the int or float or double
newNumber = Double.valueOf(number);
}else{
Boolean negative = false;
if(number.startsWith("-") || number.endsWith("-")){
number = number.replace("-", "");
negative = true;
}
if(number.startsWith("(") || number.endsWith(")"){
number = number.replace("(", "");
number = number.replace(")", "");
}
//parse numeber here using WarrenFaiths method and place the float or double
newNumber = Double.valueOf(number);
if(negative){
newNumber = newNumber * -1;
}
}
抱歉,如果替换方法有误,请指正。
"-123.23"
可以用 Float.valueOf("-123.23");
或 Double.valueOf("-123.23");
进行解析
"(123.23)"
和"123.23-"
无效,需要自行改进/解析。您可以逐步检查该字符串并检查它是否是数字,如果是,则将其添加到新字符串中。如果你在开头或结尾找到 - ,请将其设为负数...
这是黑客,请评论改进等,是时候自己学习更多了:)
private Double RegNumber(String sIn) {
Double result = 0E0;
Pattern p = Pattern.compile("^\\-?([0-9]{0,3}(\\,?[0-9]{3})*(\\.?[0-9]*))"); // -1,123.11
Matcher m = p.matcher(sIn);
if (m.matches()) {
result = Double.valueOf(sIn);
} else {
Pattern p1 = Pattern.compile("^\\(?([0-9]{0,3}(\\,?[0-9]{3})*(\\.?[0-9]*))\\)?$"); // (1,123.22)
Matcher m1 = p1.matcher(sIn);
if (m1.matches()) {
String x[] = sIn.split("(\\({1})|(\\){1})"); // extract number
result = Double.valueOf("-" + x[1]);
} else {
Pattern p2 = Pattern.compile("([0-9]{0,3}(\\,?[0-9]{3})*(\\.?[0-9]*))\\-$"); // 1,123.22-
Matcher m2 = p2.matcher(sIn);
if (m2.matches()) {
String x[] = sIn.split("(\\-{1})"); // extract number
result = Double.valueOf("-" + x[0]);
} else {
result = 99999999E99; // error, big value
}
}
}
return result;
}
如果想根据 Java 自动处理这个问题,请查看
NumberFormat
和 DecimalFormat
。 它可以正确处理本地化(例如小数点逗号或小数点,以及如何对大数字进行分组。是否应该是三个一组或其他什么,以及分组字符是否是空格、点或逗号)。
本地化(l10n)很有趣,而且并不简单。 因此,不要采用 hack 解决方案,因为它们会出现问题。这基本上就像计算时间和天数一样。计算一年中的天数并不那么容易(如果您认为您知道如何计算哪一年是闰年,那么您可能是错的)。 两者都不是计算两个日期之间的时间。您会遇到诸如夏季时间和标准时间之间的变化之类的问题,甚至还有闰秒。 一分钟有61秒甚至62秒。
所以不要这样做。
这是一个使用
NumberFormat
和 DecimalFormat
来格式化和解析数字的 Java 程序。
package se.jackson;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;
public class UseNumberFormat {
public static void main(String[] args) throws ParseException {
System.out.printf("My default locale: %s%n", Locale.getDefault());
// Get a suitable NumberFormat object, like Localized DecimalFormat.
// There are some other factory methods, look them up.
NumberFormat nf = NumberFormat.getNumberInstance();
// Parse and format with grouping for your locale (for instance 1,234.56 -> 1234.56)
nf.setGroupingUsed(true);
if (nf instanceof DecimalFormat) {
// If subclass of DecimalFormat, then go!
DecimalFormat df = (DecimalFormat) nf;
System.out.printf("DecimalFormat pattern = %s%n", df.toPattern());
System.out.printf("DecimalFormat negative prefix = %s%n", df.getNegativePrefix());
double number = -1234.5678;
String format = df.format(number); // format
Number parse = df.parse(format); // and parse
System.out.printf("df.format(%f) = \"%s\" df.parse(\"%s\") = %f%n",
number, format, format, parse.doubleValue());
// Set pattern for decimal numbers, mark negative with (1) == -1
// Notice the negative part after ";". This ignore negativePrefix.
df.applyPattern("#,##0.###;(#)");
System.out.printf("DecimalFormat pattern = %s%n", df.toPattern());
format = df.format(number); // format
parse = df.parse(format); // and parse
System.out.printf("df.format(%f) = \"%s\" df.parse(\"%s\") = %f%n",
number, format, format, parse.doubleValue());
}
System.exit(0);
}
}
我运行时的结果将是这样的。
My default locale: sv_SE
DecimalFormat pattern = #,##0.###
DecimalFormat negative prefix = −
df.format(-1234,567800) = "−1 234,568" df.parse("−1 234,568") = -1234,568000
DecimalFormat pattern = #,##0.###;(#,##0.###)
df.fMy default locale: sv_SE
DecimalFormat pattern = #,##0.###
DecimalFormat negative prefix = −
df.format(-1234,567800) = "−1 234,568" df.parse("−1 234,568") = -1234,568000
DecimalFormat pattern = #,##0.###;(#,##0.###)
df.format(-1234,567800) = "(1 234,568)" df.parse("(1 234,568)") = -1234,568000ormat(-1234,567800) = "(1 234,568)" df.parse("(1 234,568)") = -1234,568000
请注意,在此语言环境中,
−
与 -
不同。
希望这是在 Java 中解析和格式化数字的一个有用的开始。 不要忘记查看文档。