Как получить числа из строки? - PullRequest
5 голосов
/ 17 июля 2010

Я использую Java StreamTokenizer для извлечения различных слов и чисел из строки, но столкнулся с проблемой, когда речь идет о числах, которые включают запятые, например, 10 567 читается как 10,0, а 567.

Мне также нужно удалить все нечисловые символы из чисел, где они могут встречаться, например, 678,00 $ должно быть 678,00 или -87 должно быть 87.

Я считаю, что это может быть достигнуто с помощью методов whiteSpace и wordChars, но неКто-нибудь есть идеи, как это сделать?

Основной код streamTokenizer в настоящее время:

        BufferedReader br = new BufferedReader(new StringReader(text));
        StreamTokenizer st = new StreamTokenizer(br);
        st.parseNumbers();
        st.wordChars(44, 46); // ASCII comma, - , dot.
        st.wordChars(48, 57); // ASCII 0 - 9.
        st.wordChars(65, 90); // ASCII upper case A - Z.
        st.wordChars(97, 122); // ASCII lower case a - z.
        while (st.nextToken() != StreamTokenizer.TT_EOF) {
            if (st.ttype == StreamTokenizer.TT_WORD) {                    
                System.out.println("String: " + st.sval);
            }
            else if (st.ttype == StreamTokenizer.TT_NUMBER) {
                System.out.println("Number: " + st.nval);
            }
        }
        br.close(); 

Или кто-то может предложить REGEXP для достижения этой цели?Я не уверен, полезен ли здесь REGEXP, учитывая, что любое прочтение будет иметь место после чтения токенов из строки.

Спасибо

Мистер Морган.

Ответы [ 6 ]

8 голосов
/ 17 июля 2010

StreamTokenizer устарел, лучше использовать Сканер , это пример кода для вашей проблемы:

    String s = "$23.24 word -123";
    Scanner fi = new Scanner(s);
    //anything other than alphanumberic characters, 
    //comma, dot or negative sign is skipped
    fi.useDelimiter("[^\\p{Alnum},\\.-]"); 
    while (true) {
        if (fi.hasNextInt())
            System.out.println("Int: " + fi.nextInt());
        else if (fi.hasNextDouble())
            System.out.println("Double: " + fi.nextDouble());
        else if (fi.hasNext())
            System.out.println("word: " + fi.next());
        else
            break;
    }

Если вы хотите использовать запятую в качестве разделителя с плавающей точкой, используйтеfi.useLocale(Locale.FRANCE);

5 голосов
/ 17 июля 2010

Попробуйте это:

String sanitizedText = text.replaceAll("[^\\w\\s\\.]", "");

SanitizedText будет содержать только буквы, цифры и пробелы; маркировать его после этого должно быть бризом.

EDIT

Отредактировано, чтобы сохранить также десятичную точку (в конце скобки). . является "особенным" для регулярного выражения, поэтому ему требуется экранирование от обратной косой черты.

2 голосов
/ 20 декабря 2012

Это сработало для меня:

String onlyNumericText = text.replaceAll("\\\D", "");
1 голос
/ 06 августа 2010
    String str = "1,222";
    StringBuffer sb = new StringBuffer();
    for(int i=0; i<str.length(); i++)
    {
        if(Character.isDigit(str.charAt(i)))
            sb.append(str.charAt(i));
    }
    return sb.toString()
0 голосов
/ 26 ноября 2015

Код для получения чисел из строки. Например, у меня есть строка «123», тогда я хочу набрать 123.

    int getNumber(String str){
            int i=0;
            int num=0;
            int zeroAscii = (int)'0';
            while (i<str.length()) {
                int charAscii=(int)str.charAt(i);
                num=num*10+(charAscii-zeroAscii);
                 i++;
                  }   
            return num;
        }

Источник: Как получить число из строки

0 голосов
/ 17 июля 2010

Конечно, это можно сделать с помощью регулярного выражения:

s/[^\d\.]//g

Однако обратите внимание, что он съедает все запятые, что, вероятно, вам и нужно, если использовать американский формат чисел, где запятая разделяет только тысячи.В некоторых языках запятая используется вместо точки в качестве десятичного разделителя.Так что будьте осторожны при разборе международных данных.

Я оставляю это на вас, чтобы перевести это на Java.

...