带有组分隔符和小数分隔符的数字转换为十进制数



我想将数字"4,471.26"转换为十进制数"4471.26"

实际上数字"4,471.26"作为字符串接收,为了进一步处理,需要将其转换为十进制数。

"4,471.26"- 只是一种格式,所以值每次都在不断变化。此值可能类似于"654,654,25.54"

尝试将逗号(,)视为组分隔符。但看起来有不同的 ASCII 值。

String Tempholder = "4,471.26";
Decimal.valueOf(Tempholder.replaceAll(getGroupSeparator(), ""));

private char getGroupSeparator() {
DecimalFormat decFormat = new DecimalFormat();
DecimalFormatSymbols decSymbols = decFormat.getDecimalFormatSymbols();
return Character.valueOf(decSymbols.getGroupingSeparator());
}

下面的代码将是临时解决方案,但它不适用于其他地理区域。

String Tempholder = "4,471.26";
Decimal.valueOf(Tempholder.replaceAll(",", ""));

请帮忙..

你可以这样做:

public class JavaCodes{
public static void main(String[] args) {
String str = new String("4,233.19");
str = str.replaceFirst(",", "");
System.out.println(Double.valueOf(str));
}
}

好的,首先是一些假设

  • 您事先不知道区域设置
  • 如果只找到一个分隔符,
  • 并且它只出现一次,我们将其视为小数分隔符(为简单起见(
  • 如果只找到一个分隔符,但它出现多次,则它是千位分隔符
  • 任何非数字字符都是有效的分隔符
  • 如果字符串中有两个以上的非数字字符,则为错误。

所以这是算法

  • 找到第一个非数字字符并暂时将其视为小数点分隔符
  • 如果找到另一个非数字字符
    • 如果它与小数点分隔符相同,但我们仍然没有千位分隔符,请将其设置为千位分隔符并重置小数分隔符
    • 如果它与小数点分隔符相同,并且我们已经有千位分隔符,那就是错误
    • 如果它与小数点分隔符不同,则为千位分隔符
  • 从原始字符串中删除所有出现的千位分隔符(如果存在(
  • 用点
  • 替换小数点分隔符
  • 解析为双精度。

这是代码。

public class Test {
public static double parseNumber(String x) {
Character thousandsSeparator = null;
Character decimalSeparator = null;
for (int i = 0; i < x.length(); i++) {
if (!Character.isDigit(x.charAt(i))) {
if (decimalSeparator == null) {
decimalSeparator = x.charAt(i);
} else {
if (decimalSeparator.equals(x.charAt(i))) {
if (thousandsSeparator == null) {
thousandsSeparator = x.charAt(i);
decimalSeparator = null;
} else {
if (!thousandsSeparator.equals(x.charAt(i))) {
throw new IllegalArgumentException();
}
}
} else {
thousandsSeparator = x.charAt(i);
}
}
}
}
// remove thousands separator
if (thousandsSeparator != null) {
int formerSeparatorPosition;
while ((formerSeparatorPosition = x.indexOf(thousandsSeparator)) != -1) {
x = x.substring(0, formerSeparatorPosition) + x.substring(formerSeparatorPosition + 1);
}
}
// replace decimal separator with a dot
if (decimalSeparator != null) {
x = x.replace(decimalSeparator, '.');
}
return Double.parseDouble(x);
}
public static void main(String args[]) {
System.out.println(parseNumber("123.45"));
System.out.println(parseNumber("123,45"));
System.out.println(parseNumber("1.234,5"));
System.out.println(parseNumber("1,234.5"));
System.out.println(parseNumber("1,234,567.512"));
System.out.println(parseNumber("1.234.567,512"));
ystem.out.println(parseNumber("1.234.567"));
System.out.println(parseNumber("1_234_567|34")); // works with any two characters, if there are just two
try {
System.out.println(parseNumber("1_234_567|34,7")); // invalid
} catch (IllegalArgumentException e) {
System.out.println("Too many separators!");
}
}
}

解析为BigDecimal是很偶然的。对double来说更容易 但浮点只是一个近似值,会失去数字的精度。0.2 == 0.20 == 0.200 ==(实际上类似(0.1999999987。

String text = "4,471.26";
DecimalFormat format = (DecimalFormat) DecimalFormat.getInstance(Locale.US);
format.setParseBigDecimal(true);
BigDecimal number = (BigDecimal) format.parseObject(text);
// number.scale() == 2

美国区域设置使用所需的分隔符。

谢谢你们,你们的所有建议和帮助。我想出了以下解决方案。将其转换为十进制数,并适用于所有地理区域。

public static void geoSp() {
String a = "4.233,19";
NumberFormat as = NumberFormat.getInstance();
double myNumber = 0;
try {
myNumber = as.parse(a).doubleValue();
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(String.valueOf(myNumber));
}
gives  Out put :- 4233.19

最新更新