2010-09-08 1 views
100

Каков наилучший способ форматирования следующего числа, которое предоставляется мне как String?Как я могу форматировать число строк, чтобы иметь запятые и круглые?

String number = "1000500000.574" //assume my value will always be a String 

Я хочу, чтобы это было строка со значением: 1,000,500,000.57

Как я могу отформатировать его как таковой?

+0

Как мы можем сделать то же самое, если нам нужно 1 , 00,05,00,000,57 в качестве продукции? – Anand

ответ

202

Возможно, вы захотите ознакомиться с классом DecimalFormat; он поддерживает разные локали (например: в некоторых странах, которые будут отформатированы как 1.000.500.000,57).

Кроме того, необходимо, чтобы преобразовать эту строку в число, это может быть сделано с:

double amount = Double.parseDouble(number); 

Пример кода:

String number = "1000500000.574"; 
double amount = Double.parseDouble(number); 
DecimalFormat formatter = new DecimalFormat("#,###.00"); 

System.out.println(formatter.format(amount)); 
+0

вы можете показать пример того, как я могу использовать NumberFormat с этим конкретным случаем? –

+1

Что, вероятно, указывает на неочевидное решение проблемы ... – LeviX

+1

вы также можете использовать ниже решение - общественности статической строки getRoundOffValue (двойное значение) { \t \t \t \t DecimalFormat ДФ = новый DecimalFormat (» ##, ##, ##, ##, ##, ##, ## 0.00"); \t \t return df.format (value); } –

29

После того, как вы конвертированы вашу строку в число, вы можно использовать

// format the number for the default locale 
NumberFormat.getInstance().format(num) 

или

// format the number for a particular locale 
NumberFormat.getInstance(locale).format(num) 
+0

Как указать локаль * и * круглый (скажем) 2 десятичных знака? – Jonik

+5

Ах, неважно, нашел это: 'new DecimalFormat (« 0. ## », DecimalFormatSymbols.getInstance (locale))' – Jonik

10

Я создал свою собственную утилиту форматирования. Что очень быстро при обработке форматирования вместе с давая вам много возможностей :)

Он поддерживает:

  • Comma Форматирование Э.Г. 1234567 - 1,234,567.
  • Префикс «Тысяча (K), Миллион (M), Миллиард (B), Триллион (T)».
  • Прецизионность от 0 до 15.
  • Прецизионный повторный калибровка (означает, что если вы хотите иметь 6-значную точность, но имеете только 3 доступных цифры, это заставляет ее 3).
  • Опускание префикса (означает, что префикс, который вы выбираете, слишком велик, он снижает его до более подходящего префикса).

Код может быть найден here. Вы называете это так:

public static void main(String[]) 
{ 
    int settings = ValueFormat.COMMAS | ValueFormat.PRECISION(2) | ValueFormat.MILLIONS; 
    String formatted = ValueFormat.format(1234567, settings); 
} 

Я хотел бы также отметить, это не обрабатывает десятичную поддержки, но очень полезно для целочисленных значений. В приведенном выше примере в качестве вывода будет отображаться «1.23M». Возможно, я мог бы добавить десятичную поддержку, но не видел слишком много пользы для нее, так как тогда я мог бы объединить это в класс типа BigInteger, который обрабатывает сжатые char [] массивы для математических вычислений.

+2

Это хорошо, если вы работаете только на английском языке. Мое предложение состоит в том, чтобы избежать такой вещи, как это раздражало обед моих неанглийских пользователей, поскольку они не могли понять, что означает 'K' или' M' означает – rishabhmhjn

+0

@rishabhmhjn, но ... не могли бы вы просто настроить его, чтобы изменить на любое письмо, которое вы необходимость? твоя неудача его вина? : o и то, что он создал, довольно круто, несмотря на то, что ссылка кажется недоступной прямо сейчас. –

+0

@AquariusPower проблема в том, что, например, японские номера не соответствуют метрической системе. Их количество равно 1 百 для 100, 1 千 для 1000, 1 万 для 10000, затем оно составляет 1 千万 за 1000,0000. Моя команда работала над чем-то подобным в Javascript. Вы можете использовать логику, упомянутую в этом: https://github.com/statusbrew/angular-bignumber – rishabhmhjn

2

Первый ответ работает очень хорошо, но для ZERO/0 будет форматировать, как +0,00

Поэтому формат #, ## 0.00 хорошо работает для меня. Перед развертыванием в производственную систему всегда проверяйте разные номера, такие как 0/100/2334.30 и отрицательные числа.

4

вы также можете использовать ниже решения -

public static String getRoundOffValue(double value){ 

     DecimalFormat df = new DecimalFormat("##,##,##,##,##,##,##0.00"); 
     return df.format(value); 
} 
6
public void convert(int s) 
{ 
    System.out.println(NumberFormat.getNumberInstance(Locale.US).format(s)); 
} 

public static void main(String args[]) 
{ 
    LocalEx n=new LocalEx(); 
    n.convert(10000); 
} 
-2

Этого класс для простого индийской цены форматировщика

public class Test { 

public static void main (String a[]){ 
    System.out.println(priceFormatter("10023"));  
} 
/** 
* This method is to convert the price into Indian price 
* separator format 
* @param inputPrice 
* @return 
*/ 
public static String priceFormatter(String inputPrice){ 
    try { 
     if(!isNumeric(inputPrice)){ 
      return inputPrice; 
     } 
     // to check if the number is a decimal number 
     String newPrice = "",afterDecimal = ""; 
     if(inputPrice.indexOf('.') != -1){ 
      newPrice = inputPrice.substring(0,inputPrice.lastIndexOf('.')); 
      afterDecimal = inputPrice.substring(inputPrice.lastIndexOf('.')); 
     }else{ 
      newPrice = inputPrice; 
     } 
     int length = newPrice.length(); 
     if (length < 4) { 
      return inputPrice; 
     } 
     // to check whether the length of the number is even or odd 
     boolean isEven = false; 
     if (length % 2 == 0) { 
      isEven = true; 
     } 
     // to calculate the comma index 
     char ch[] = new char[length + (length/2 - 1)]; 
     if (isEven) { 
      for (int i = 0, j = 0; i < length; i++) { 
       ch[j++] = inputPrice.charAt(i); 
       if (i % 2 == 0 && i < (length - 3)) { 
        ch[j++] = ','; 
       } 
      } 
     } else { 
      for (int i = 0, j = 0; i < length; i++) { 
       ch[j++] = inputPrice.charAt(i); 
       if (i % 2 == 1 && i < (length - 3)) { 
        ch[j++] = ','; 
       } 
      } 
     } 
     // conditional return based on decimal number check 
     return afterDecimal.length() > 0 ? String.valueOf(ch) + afterDecimal : String.valueOf(ch); 

    } catch(NumberFormatException ex){ 
     ex.printStackTrace(); 
     return inputPrice; 
    } 
     catch (Exception e) { 
     e.printStackTrace(); 
     return inputPrice; 
    } 
} 

} 
3

Вы можете сделать все преобразования в одной строке, используя следующий код:

String number = "1000500000.574"; 
String convertedString = new DecimalFormat("#,###.##").format(Double.parseDouble(number)); 

Последние два символа # в конструкторе DecimalFormat также могут быть 0s. В любом случае.

19

Это также может быть выполнено с использованием String.format(), что может быть проще и/или более гибким, если вы форматируете несколько номеров в одной строке.

String number = "1000500000.574"; 
    Double numParsed = Double.parseDouble(number); 

    System.out.println(String.format("The input number is: %,.2f", numParsed)); 
    // Or 
    String numString = String.format("%,.2f", numParsed); 

Для строки формата «% ,. ого» - «» означает, что отдельные группы цифры с запятыми, и».2" означает раунд до двух мест после запятой.

Для справки о других параметрах форматирования см https://docs.oracle.com/javase/tutorial/java/data/numberformat.html

+1

самое красивое решение imo, работает точно так, как ожидалось –

+1

работает как шарм –

2

Вот самый простой способ добраться:

String number = "10987655.876"; 
double result = Double.parseDouble(number); 
System.out.println(String.format("%,.2f",result)); 

выход: 10,987,655.88

+0

это не работает в android –