2010-08-24 4 views
9

У меня есть строка, скажем, «600sp», из которой я хочу получить целую часть (600).Лучший способ получить целую часть строки «600sp»?

Если у меня есть Integer.valueOf("600sp") Я получаю исключение из-за нечислового значения «s», которое встречается в строке.

Какой самый быстрый способ захватить целую часть?

Спасибо!

+2

Является ли числовая часть гарантией появления первой? всегда ли это трехзначное число? –

+0

Да, это всегда число переменной длины, за которым следует sp. –

ответ

13

Если формат строки всегда будет числом с некоторыми символами, то попробуйте этот

mystr.split("[a-z]")[0] 
+0

короткий и сладкий, идеальный - спасибо. –

+0

прохладный решение! – stratwine

+0

это приведет к сбою при подаче пустой строки и может привести к недействительным результатам, если вы отправили строку с международными символами – Jherico

1

Вы можете использовать

Integer.valueOf("0" + "600sp".replaceAll("(\\d*).*", "$1")) 

Примечание:

С помощью этого регулярного выражения вы будете держать только начальные цифры.


Edit: "0" + используется не врезаться, когда у меня нет цифр. Tks @jherico!

+0

Это приведет к сбою, если строка не содержит цифр. – Jherico

+0

@jherico: tks! Я исправлю. – Topera

6

В зависимости от ограничений вашего ввода, вам может быть лучше с регулярным выражением.

Pattern p = Pattern.compile("(\\d+)"); 
    Matcher m = p.matcher("600sp"); 
    Integer j = null; 
    if (m.find()) { 
     j = Integer.valueOf(m.group(1)); 
    } 

Это регулярное выражение переводится как «дайте мне набор смежных цифр в начале строки, где есть по крайней мере одна цифра. Если у вас есть другие ограничения, такие как синтаксический анализ реальных чисел, а не целых чисел, вам необходимо изменить код.

2

Для более короткого и менее конкретного решения добавьте больше контекста.

StringBuffer numbers = new StringBuffer(); 
for(char c : "asdf600sp".toCharArray()) 
{ 
    if(Character.isDigit(c)) numbers.append(c); 
} 

System.out.println(numbers.toString()); 

В свете новой информации, улучшенное решение:

Integer.valueOf("600sp".replace("sp","")); 
1

Если строка гарантирована (как вы говорите, она) является целым числом, за которым следует «sp», я бы посоветовал не использовать более общий анализатор регулярных выражений, который также принимал бы другие варианты (это должно быть reje cted как ошибки).

Просто проверьте, закончится ли это «sp», затем проанализируйте подстроку без двух последних символов.

+0

Это очень хороший момент. Спасибо, Тило. –

2

Я знаю, что на это уже было дан ответ, но вы считали java.util.Scanner? Кажется, что он идеально подходит для векселя без регулярных или других сложных сетевых утилит.

Смежные вопросы