Что такое самый простой и правильный способ преобразования числа строк с запятыми (например: 835,111.2) в экземпляр Double.Преобразование строки в двойную - Java
Спасибо.
Что такое самый простой и правильный способ преобразования числа строк с запятыми (например: 835,111.2) в экземпляр Double.Преобразование строки в двойную - Java
Спасибо.
Посмотрите на java.text.NumberFormat
. Например:
import java.text.*;
import java.util.*;
public class Test
{
// Just for the sake of a simple test program!
public static void main(String[] args) throws Exception
{
NumberFormat format = NumberFormat.getInstance(Locale.US);
Number number = format.parse("835,111.2");
System.out.println(number); // or use number.doubleValue()
}
}
В зависимости от того, какое количество вы используете, хотя, вы можете разобрать на BigDecimal
вместо. Самый простой способ сделать это, вероятно:
BigDecimal value = new BigDecimal(str.replace(",", ""));
или использовать DecimalFormat
с setParseBigDecimal(true)
:
DecimalFormat format = (DecimalFormat) NumberFormat.getInstance(Locale.US);
format.setParseBigDecimal(true);
BigDecimal number = (BigDecimal) format.parse("835,111.2");
Использование java.text.DecimalFormat:
DecimalFormat представляет собой конкретный подкласс из NumberFormat, который форматирует десятичные числа номеров. Он имеет множество функций: , предназначенный для анализа и номеров форматов в любом регионе, , включая поддержку для западных, арабских, и индикативных цифр. Он также поддерживает различные номера чисел, в том числе целые числа (123), номера фиксированной зап. (123.4), научные обозначения (1.23E4), проценты (12%) и валюта суммы ($ 123). Все они могут быть локализованы .
Самый легкий не всегда самый правильный. Вот самый простой:
String s = "835,111.2";
// NumberFormatException possible.
Double d = Double.parseDouble(s.replaceAll(",",""));
Я не надоела локалей, так как вы конкретно указано что вы хотели запятые заменить, поэтому я предполагаю, что вы уже установили себе в качестве локали с запятой является разделителем тысяч, а период десятичный разделитель. Здесь есть лучшие ответы, если вы хотите правильного (с точки зрения интернационализации) поведения.
A link can say more than thousand words
// Format for CANADA locale
Locale locale = Locale.CANADA;
String string = NumberFormat.getNumberInstance(locale).format(-1234.56); // -1,234.56
// Format for GERMAN locale
locale = Locale.GERMAN;
string = NumberFormat.getNumberInstance(locale).format(-1234.56); // -1.234,56
// Format for the default locale
string = NumberFormat.getNumberInstance().format(-1234.56);
// Parse a GERMAN number
try {
Number number = NumberFormat.getNumberInstance(locale.GERMAN).parse("-1.234,56");
if (number instanceof Long) {
// Long value
} else {
// Double value
}
} catch (ParseException e) {
}
мертвая ссылка не может –
Хорошая точка, используется [обратная машина] (http://web.archive.org/web/20110702052222/http: //exampledepot.com/egs/java.text/Numbers.html) и скопировал пример –
There is small method to convert german price format
public static BigDecimal getBigDecimalDe(String preis) throws ParseException {
NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN);
Number number = nf.parse(preis);
return new BigDecimal(number.doubleValue());
}
----------------------------------------------------------------------------
German format BigDecimal Preis into decimal format
----------------------------------------------------------------------------
public static String decimalFormat(BigDecimal Preis){
String res = "0.00";
if (Preis != null){
NumberFormat nf = NumberFormat.getInstance(Locale.GERMANY);
if (nf instanceof DecimalFormat) {
((DecimalFormat) nf).applyPattern("###0.00");
}
res = nf.format(Preis);
}
return res;
}
---------------------------------------------------------------------------------------
/**
* This method converts Deutsche number format into Decimal format.
* @param Preis-String parameter.
* @return
*/
public static BigDecimal bigDecimalFormat(String Preis){
//MathContext mi = new MathContext(2);
BigDecimal bd = new BigDecimal(0.00);
if (!Util.isEmpty(Preis)){
try {
// getInstance() obtains local language format
NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN);
nf.setMinimumFractionDigits(2);
nf.setMinimumIntegerDigits(1);
nf.setGroupingUsed(true);
java.lang.Number num = nf.parse(Preis);
double d = num.doubleValue();
bd = new BigDecimal(d);
} catch (ParseException e) {
e.printStackTrace();
}
}else{
bd = new BigDecimal(0.00);
}
//Rounding digits
return bd.setScale(2, RoundingMode.HALF_UP);
}
Вы уверены, что 'NumberFormat.getInstance' всегда возвращает экземпляр' DecimalFormat'. И разве ручная замена запятых точками не отменяет всю идею локализации? –
@Tadeusz: Вопрос в частности о «числах с запятыми» - не «цифры в текущем регионе». Когда вопрос является конкретным, имеет смысл для конкретного ответа. Что касается NumberFormat.getInstance потенциально не возвращает DecimalFormat - да, это возможность. Если честно, я не уверен, что это лучший способ. API не особенно полезен там :( –
хорошо. очень полезно –