Как вставить запятые в число внутри строки из других слов - PullRequest
2 голосов
/ 09 января 2012

У меня есть String вроде следующего:

"The answer is 1000"

Я хочу вставить запятую в число 1000, не уничтожая остальные String.

ПРИМЕЧАНИЕ: я также хочу использовать это для других String s различной длины, поэтому substring(int index) не рекомендуется для получения номера.

Лучший способ, который я могу придумать, - это использовать команду regex, но я понятия не имею, как.

Заранее спасибо!

Ответы [ 3 ]

5 голосов
/ 09 января 2012

В следующих форматах все недесятичные числа:

public String formatNumbers(String input) {
  Pattern p = Pattern.compile("\\d+");
  Matcher m = p.matcher(input);
  NumberFormat nf = NumberFormat.getInstance();        
  StringBuffer sb = new StringBuffer();
  while(m.find()) {
    String g = m.group();
    m.appendReplacement(sb, nf.format(Double.parseDouble(g)));            
  }
  return m.appendTail(sb).toString();
}

например. если вы звоните: formatNumbers("The answer is 1000 1000000")

Результат: "The answer is 1,000 1,000,000"

См .: NumberFormat и Matcher.appendReplacement().

1 голос
/ 09 января 2012

изменено с Наиболее эффективный способ извлечь все (натуральные) числа из строки :

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class Example {

private static final String REGEX = "\\d+";

public static void main(String[] args) {
    String input = "dog dog 1342 dog doggie 2321 dogg";
    Pattern p = Pattern.compile(REGEX);
    Matcher m = p.matcher(input); // get a matcher object
    int end = 0;
    String result = "";
    while (m.find()) {
        result = result + input.substring(end, m.start());
        result = result
                + addCommas(
                        input.substring(
                                m.start(), m.end()));
        end = m.end();
    }
    System.out.println(result);
}

private static String addCommas(String s) {
    char[] c = s.toCharArray();
    String result = "";
    for (int i = 0; i < s.length(); i++) {
        if (s.length() % 3 == i % 3)
            result += ",";

        result += c[i];
    }
    return result;
}

}

0 голосов
/ 09 января 2012

Вы можете использовать регулярное выражение:

[0-9]+

Чтобы найти непрерывные наборы цифр, чтобы они соответствовали 1000, или 7500, или 22387234 и т. Д. Вы можете проверить это на http://regexpal.com/ Это не относится к случаю чисел с десятичными точками, кстати.

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

  • Вы используете этот шаблон, чтобы найти индекс (ы) совпадений в строке (индекс символов, с которых начинаются различные совпадения)
  • Из каждого из этих индексов вы копируете цифры во временную строку, содержащую только цифры номера (ов) в строке
  • Вы пишете функцию, которая начинается в конце строки, и для каждой третьей цифры (от конца) вы вставляете запятую перед ней, если индекс текущего символа не равен 0 (что помешает * 1021). * из превращенного в ,300
  • Замените исходное число в исходной строке строкой с запятой, используя метод replace ()
...