簡體   English   中英

帶組分隔符和十進制分隔符的數字轉換為十進制數

[英]Number with group-separator and decimal-separator convert into decimal number

我想將數字"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是非常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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM