2016-11-09 11 views
3

Я пытаюсь применить этот формат к заданному номеру int #´###,### Я пробовал с DecimalFormat class, но он позволяет только иметь один разделитель разделителей групп, когда мне нужно иметь два значения accute accent для миллионов и запятых для тысяч.Как я могу форматировать int номера в java?

Таким образом, в конце концов, я могу форматировать значения, как 1,000 или миллионы таким образом 1´000,000

+0

check http://stackoverflow.com/questions/5114762/how-do-format-a-phone-number-as-a-string-in-java – Roshan

+0

@Roshan решения в этом вопросе используют 'подстрока() 'или' replace() ', что может быть нормально для телефонных номеров, но это не лучшая идея при работе с фактическими числами (например, деньги). OP нужно будет учитывать отрицательные числа, цифры без десятичной точки и т. Д. – walen

+0

Спасибо @Roshan! –

ответ

1

я нашел полезную ссылку @Roshan предоставить в комментариях, это решение использует регулярное выражение и методы replaceFirst

public static String audienceFormat(int number) { 
    String value = String.valueOf(number); 

    if (value.length() > 6) { 
      value = value.replaceFirst("(\\d{1,3})(\\d{3})(\\d{3})", "$1\u00B4$2,$3"); 
     } else if (value.length() >=5 && value.length() <= 6) { 
      value = value.replaceFirst("(\\d{2,3})(\\d{3})", "$1,$2"); 
     } else { 
      value = value.replaceFirst("(\\d{1})(\\d+)", "$1,$2"); 
     } 

    return value; 
} 

Я не знаю, если это решение имеет влияние на производительность, а также я Rockie с регулярным выражением, поэтому этот код может быть закорочен.

-1

Может попробовать использовать это, «#» на месте с единицами, которые вы хотите перед пробелом или запятой.

String num = "1000500000.574"; 
    String newnew = new DecimalFormat("#,###.##").format(Double.parseDouble(number)); 
+0

Если это сработало, просто дайте мне знать –

+0

OP специально сказал, что DecimalFormat не работает. – walen

+0

Спасибо @TiagoFutre, но формат, который он не работает в моем конкретном случае –

1

Я всегда предпочитаю использовать string.Format, но я не уверен, если есть Locale, который будет форматировать числа как что либо. Вот какой код, который будет выполнять эту работу.

// Not sure if you wanted to start with a number or a string. Adjust accordingly 
String stringValue = "1000000"; 
float floatValue = Float.valueOf(stringValue); 

// Format the string to a known format 
String formattedValue = String.format(Locale.US, "%,.2f", floatValue); 

// Split the string on the separator 
String[] parts = formattedValue.split(","); 

// Put the parts back together with the special separators 
String specialFormattedString = ""; 
int partsRemaining = parts.length; 
for(int i=0;i<parts.length;i++) 
{ 
    specialFormattedString += parts[i]; 
    partsRemaining--; 
    if(partsRemaining > 1) 
     specialFormattedString += "`"; 
    else if(partsRemaining == 1) 
     specialFormattedString += ","; 
} 
1

Попробуйте эти Locale форматы в нужном Вам формате.

List<Locale> locales = Arrays.asList(new Locale("it", "CH"), new Locale("fr", "CH"), new Locale("de", "CH")); 
    for (Locale locale : locales) { 
     DecimalFormat df = (DecimalFormat) NumberFormat.getCurrencyInstance(locale); 
     DecimalFormatSymbols dfs = df.getDecimalFormatSymbols(); 
     dfs.setCurrencySymbol(""); 
     df.setDecimalFormatSymbols(dfs); 
     System.out.println(String.format("%5s %15s %15s", locale, format(df.format(1000)), format(df.format(1_000_000)))); 
    } 

метод Util

private static String format(String str) { 
    int index = str.lastIndexOf('\''); 
    if (index > 0) { 
     return new StringBuilder(str).replace(index, index + 1, ",").toString(); 
    } 
    return str; 
} 

выход

it_CH  1,000.00 1'000,000.00 
fr_CH  1,000.00 1'000,000.00 
de_CH  1,000.00 1'000,000.00 

установить df.setMaximumFractionDigits(0); для удаления фракций

выход

it_CH   1,000  1'000,000 
fr_CH   1,000  1'000,000 
de_CH   1,000  1'000,000