2011-11-24 127 views
2

说我有一个字符串phone = "1-800-test"将一串字母转换为数字

我需要将字母转换为数字。

做这样的事情不工作(注意我环路,当然):

phone = phone.replace(phone.charAt(9), (char) getNumber(phone.charAt(9))); 

注意getNumber()是需要一个字母,并返回一个数字的方法:

int getNumber(char uppercaseLetter) 

无论如何,我得到了一些怪异的输出,用一个奇怪的正方形替换了字母。

我应该如何用数字替换字母?

回答

2

做(字符)1给你由1代表的ASCII字符,所以你得到奇怪的广场。 您可以使用'1'来代替。如果你坚持把整数转换为ASCII码,只需加48(因为这是数字以ascii开头的地方)。即(char)48是'0',(char)49是'1'等等。这对我来说似乎不是必要的。

确切的回答你的问题,是使用:

phone = phone.replace(phone.charAt(9), (char)(48+getNumber(phone.charAt(9)))); 

但它不是推荐...

+0

不幸的是,这不是一个选项,因为我将值传递给方法。我已经编辑我的问题的清晰度 – lelouch

+0

我真的不明白为什么,但你可以添加48的数字之前铸造字符在它会工作。即(char)48是'0'(char)49是'1'等等。 – idanzalz

10

(char)1不是你所需要的。你需要'1'

好办法做到这一点是建立一个Map<Character, Character>,预填充它:map.put('t', '8')等所有字母,然后

for (...) { 
    Character letter = phone.charAt(i); 
    Character digit = map.get(Character.toLowerCase(letter)); 
    if (digit != null) { 
     phone = phone.replace(letter, digit); 
    } 
} 

一个平凡的解决办法是只需要为每个字符一行:

phone = phone.replace('a', '2'); 
phone = phone.replace('b', '2'); 
//etc.. 

(或者,为了更好的性能,利用StringBuilder'sreplace(..)indexOf(..)

+0

似乎一个简单(或因此我想)的事情相当复杂。 :S 有没有更简单但不太“正确”的方式呢? – lelouch

+0

这很简单 - 5行。而且没有简单的方法,因为你必须能够用所有的角色替换所有的角色。 – Bozho

+0

当然,你可以简单地去每个char有一个替换行 - 看我的更新 – Bozho

相关问题