Java:从字符中解析int值

251

我只是想知道是否有更好的解决办法来从字符串中的字符解析数字(假设我们知道索引n处的字符是一个数字)。

String element = "el5";
String s;
s = ""+element.charAt(2);
int x = Integer.parseInt(s);

//result: x = 5

(毋庸置疑,这只是一个例子)

10个回答

476

尝试使用Character.getNumericValue(char)

String element = "el5";
int x = Character.getNumericValue(element.charAt(2));
System.out.println("x=" + x);

生成:

x=5

getNumericValue(char) 的好处在于它也适用于像 "el٥""el५" 这样的字符串,其中 ٥ 分别是阿拉伯东部和印地语/梵文中的数字5。


Java 8 新增了一个方法 Character.digit(char ch, int radix)。如果你想限制只能是数字 0-9,你可以写成 int x = Character.digit(element.charAt(2), 10); - John Gilmer

72

请尝试以下方法:

str1="2345";
int x=str1.charAt(2)-'0';
//here x=4;

如果您减去字符'0',则无需知道ASCII值。


1
这是什么原因?结果是ASCI中的'0'与ASCI中的字符之间的减法运算吗? - Ignacio Chiazzo
13
因为ASCII中的值'0','1','2'等是递增的。例如,'0'在ASCII中表示为48,'1'表示为49,以此类推。因此,如果你计算'2'-'0',实际上就是计算50-48=2。查看ASCII表可更好地理解这个原理。另外,在Java中,'x'表示获取字符的ASCII值。 - Kevin Van Ryckegem
1
@KevinVanRyckegem 谢谢!我一直在寻找为什么 - '0' 起作用...我以为这是 Java 解释字符或其他东西的深奥魔法...这确实是我过于复杂化某些事情的情况... - scoots
1
虽然这是一个很巧妙的技巧,但使用Character.getNumericValue会更易读。 - Janac Meena

41

从性能角度来看,那可能是最好的选择,但它很简陋:

String element = "el5";
String s;
int x = element.charAt(2)-'0';

如果你假设你的字符是数字,并且只在总是使用Unicode的语言(如Java)中才有效...


7
请用字符串“el५”尝试,其中“५”是印度的数字5。 :) - Bart Kiers
3
我相信你为找到这个例子付出了很大努力... :-) 如果你需要分析非阿拉伯数字,避免使用这种方法。就像我说的,它很粗糙。但在99.999%的情况下,它仍然是最快的方法。 - Alexis Dufrenoy
@AlexisDufrenoy,为什么减去字符“'0'”会返回整数值? - Istiaque Ahmed
1
查看ASCII表中的值,字符'9'=整数57,字符'0'=整数48,这导致'9'-'0'= 57-48 = 9。 - WHDeveloper
1
运行得非常好。哈哈,反例和所有抄袭你答案的印度人都很讽刺。 - omikes

16

通过将数字字符(0到9)减去字符'0'(零),可以将其转换为整数(0到9),例如,'5'-'0'得到整数5。

String str = "123";

int a=str.charAt(1)-'0';

6
String a = "jklmn489pjro635ops";

int sum = 0;

String num = "";

boolean notFirst = false;

for (char c : a.toCharArray()) {

    if (Character.isDigit(c)) {
        sum = sum + Character.getNumericValue(c);
        System.out.print((notFirst? " + " : "") + c);
        notFirst = true;
    }
}

System.out.println(" = " + sum);

1

简而言之

Integer.parseInt( Character.toString( "el5".codePoints().toArray()[ 2 ] ) )

或者,重新格式化:

Integer
.parseInt(               // Parses a `String` object whose content is characters that represent digits.
    Character
    .toString(           // Converts a code point integer number into a string containing a single character, the character assigned to that number. 
        "el5"            // A `String` object.
        .codePoints()    // Returns an `IntStream`, a stream of each characters code point number assigned by the Unicode Consortium.
        .toArray()       // Converts the stream of `int` values to an array, `int[]`. 
        [ 2 ]            // Returns an `int`, a code point number. For digit `5` the value here would be 53. 
    )                    // Returns a `String`, "5". 
)                        // Returns an `int`, `5`. 

请看这个 在 IdeOne.com 上实时运行的代码

5

char已经过时了

避免使用char。这种类型在Java 2中就已经过时了,基本上是有问题的。作为一个16位值,char/Character类型无法表示大多数字符。

因此,避免调用element.charAt(2)。也要避免使用单引号字面量,例如'5'

代码点

相反,使用代码点整数。

Unicode定义的超过140,000个字符中的每一个都被永久地分配了一个标识号码。这些数字从零到一百万多不等。

您可以获得所有代码点数字的流,即IntStream

String element = "el5"; 
IntStream stream = element.codePoints() ;

你可以将它转换成数组。
int[] codePoints = element.codePoints().toArray() ;

然后访问该数组。

String out3 = "Third character: " + Character.toString( codePoints[2] ) + " | Code point: " + codePoints[2] + " | Named: " + Character.getName( codePoints[2] ) ;
String out4 = "Fourth character: " + Character.toString( codePoints[3] ) + " | Code point: " + codePoints[3] + " | Named: " + Character.getName( codePoints[3] ) ;

System.out.println( out3 ) ;
System.out.println( out4 ) ;

查看这个 在IdeOne.com上实时运行的代码

第三个字符:5 | 代码点:53 | 命名:DIGIT FIVE

第四个字符: | 代码点:128567 | 命名:带医用口罩的脸

你可以测试一下代码点是否代表一个数字字符

if( Character.isDigit( codePoints[2] ) )
{
    String digit = Character.toString( codePoints[2] ) ;
    int i = Integer.parseInt( digit ) ;  // Parse the character `5` as a `int` integer number. 
}

0

整数:整数或int数据类型是32位带符号补码整数。其值范围在-2,147,483,648(-2^31)到2,147,483,647(2^31 -1)之间(包括边界)。它的最小值为-2,147,483,648,最大值为2,147,483,647。其默认值为0。 int数据类型通常用作积分值的默认数据类型,除非内存没有问题。

Example: int a = 10

字符:char数据类型是一个单一的16位Unicode字符。它的值范围在'\u0000'(或0)到'\uffff'(或65,535,包括)之间。char数据类型用于存储字符。

Example: char ch = 'c'

方法

有多种方法可以将Char类型转换为Integer(int)类型,以下列出了其中几种。

  • 使用ASCII值
  • 使用String.valueOf() 方法
  • 使用Character.getNumericValue() 方法

1. 使用ASCII值

此方法使用类型转换来获取给定字符的ASCII值。 从0的ASCII值中减去该值得到相应的整数。 换句话说,此方法通过找到此字符的ASCII值和0的ASCII值之间的差异来将char转换为int。

例如:

// Java program to convert
// char to int using ASCII value
  
class GFG {
    public static void main(String[] args)
    {
  
        // Initializing a character(ch)
        char ch = '3';
        System.out.println("char value: " + ch);
  
        // Converting ch to it's int value
        int a = ch - '0';
        System.out.println("int value: " + a);
    }
}

输出

char value: 3
int value: 3

2. 使用 String.valueOf() 方法

String 类的 valueOf() 方法可以将各种类型的值转换为字符串。它可以将 int、char、long、boolean、float、double、object 和 char 数组转换为字符串,这些字符串可以通过使用 Integer.parseInt() 方法转换为 int 值。下面的程序演示了使用 valueOf() 方法的用法。

示例:

// Java program to convert
// char to int using String.valueOf()
  
class GFG {
    public static void main(String[] args)
    {
        // Initializing a character(ch)
        char ch = '3';
        System.out.println("char value: " + ch);
  
        // Converting the character to it's int value
        int a = Integer.parseInt(String.valueOf(ch));
        System.out.println("int value: " + a);
    }
}

输出

char value: 3
int value: 3

3. 使用Character.getNumericValue()方法

Character类的getNumericValue()方法用于获取任何特定字符的整数值。例如,字符'9'将返回一个值为9的int类型。下面的程序演示了getNumericValue()方法的使用。

示例:

// Java program to convert char to int
// using Character.getNumericValue()
  
class GFG {
    public static void main(String[] args)
    {
  
        // Initializing a character(ch)
        char ch = '3';
        System.out.println("char value: " + ch);
  
        // Converting the Character to it's int value
        int a = Character.getNumericValue(ch);
        System.out.println("int value: " + a);
    }
}

输出

char value: 3
int value: 3

参考:https://www.geeksforgeeks.org/java-program-to-convert-char-to-int/


0

Character.digit 方法可以用于此操作。第一个参数是 charint 代码点,第二个参数是基数。

char c = '5';
int x = Character.digit(c, 10); // result: 5

0
String element = "el5";
int x = element.charAt(2) - 48;

从字符中减去'0'的ASCII值=48


0

使用二进制 AND0b1111

String element = "el5";

char c = element.charAt(2);

System.out.println(c & 0b1111); // => '5' & 0b1111 => 0b0011_0101 & 0b0000_1111 => 5

// '0' & 0b1111 => 0b0011_0000 & 0b0000_1111 => 0
// '1' & 0b1111 => 0b0011_0001 & 0b0000_1111 => 1
// '2' & 0b1111 => 0b0011_0010 & 0b0000_1111 => 2
// '3' & 0b1111 => 0b0011_0011 & 0b0000_1111 => 3
// '4' & 0b1111 => 0b0011_0100 & 0b0000_1111 => 4
// '5' & 0b1111 => 0b0011_0101 & 0b0000_1111 => 5
// '6' & 0b1111 => 0b0011_0110 & 0b0000_1111 => 6
// '7' & 0b1111 => 0b0011_0111 & 0b0000_1111 => 7
// '8' & 0b1111 => 0b0011_1000 & 0b0000_1111 => 8
// '9' & 0b1111 => 0b0011_1001 & 0b0000_1111 => 9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接