Java:charAt转换为int?

时间:2010-04-13 06:19:59

标签: java

我想输入我的nirc号码,例如S1234567I,然后将1234567个体化为indiv1整数,charAt(1)indiv2charAt(2)indiv为{{{ 1}}等等。但是,当我使用下面的代码时,我似乎无法得到第一个数字?有什么想法吗?

charAt(3)

6 个答案:

答案 0 :(得分:17)

你将获得49,50,51等 - 这些是字符“1”,“2”,“3”等的Unicode代码点。

如果你知道他们将是西方数字,你可以减去'0':

int indiv1 = nric.charAt(1) - '0';

但是,你应该只在你已经在别处验证字符串的格式正确之后才这样做 - 否则你最终会得到虚假的数据 - 例如,'A'最终会返回17而不是造成错误。

当然,一种选择是获取值,然后检查结果是否在0-9范围内。另一种方法是使用:

int indiv1 = Character.digit(nric.charAt(1), 10);

如果字符不是合适的数字,则返回-1。

我不确定后一种方法是否会涵盖非西方数字 - 第一种肯定不会 - 但听起来这对你的情况不会有问题。

答案 1 :(得分:2)

答案 2 :(得分:0)

try {
   int indiv1 = Integer.parseInt ("" + nric.charAt(1));
   System.out.println(indiv1);
} catch (NumberFormatException npe) {
   handleException (npe);
}

答案 3 :(得分:0)

我知道问题是关于char到int但是值得一提,因为char中也有负数))

从JavaHungry您必须注意整数的负数 如果你不使用Character。

将字符串转换为整数:伪代码

   1.   Start number at 0

   2.   If the first character is '-'
                   Set the negative flag
                   Start scanning with the next character
          For each character in the string  
                   Multiply number by 10
                   Add( digit number - '0' ) to number
            If  negative flag set
                    Negate number
                    Return number

public class StringtoInt {

public static void main (String args[])
{
    String  convertingString="123456";
    System.out.println("String Before Conversion :  "+ convertingString);
    int output=    stringToint( convertingString );
    System.out.println("");
    System.out.println("");
    System.out.println("int value as output "+ output);
    System.out.println("");
}




  public static int stringToint( String str ){
        int i = 0, number = 0;
        boolean isNegative = false;
        int len = str.length();
        if( str.charAt(0) == '-' ){
            isNegative = true;
            i = 1;
        }
        while( i < len ){
            number *= 10;
            number += ( str.charAt(i++) - '0' );
        }
        if( isNegative )
        number = -number;
        return number;
    }   
}

答案 4 :(得分:0)

tl; dr

现代的解决方案使用Unicode code point数字而不是过时的char类型。

这是一个IntStream,每个字符的代码点编号的连续流,将每个编号打印到控制台:

"S1234567I"
.codePoints()
.forEach( System.out :: println )
83
49
50
51
52
53
54
55
73

显示每个字符及其代码点编号。要将代码点数字转换回字符,请在传递整数Character.toString( codePoint )的同时调用Character.toString

String s = Character.toString( 49 ) ;  // Returns "1". 

…和…

String s = Character.toString( 128_567 ) ;  // Returns "?" FACE WITH MEDICAL MASK. 

示例:

"S1234567I".codePoints().forEach( ( int codePoint ) -> {
    String message = Character.toString( codePoint ) + " → " + codePoint;
    System.out.println( message );
} );
S → 83
1 → 49
2 → 50
3 → 51
4 → 52
5 → 53
6 → 54
7 → 55
I → 73

Unicode代码点

char类型已过时,无法表示Unicode中定义的143,859个字符的一半。 char类型是下方的16-bit数字,能够表示大约±64,000的数字范围。分配给Unicode字符的数字范围约为一百万,对于char来说太大了。

相反,请使用Unicode code point整数表示单个字符。

我们可以从字符串中获得int个原始值(IntStream)的流,每个数字代表每个连续字符的Unicode代码点。

IntStream intStream = "S1234567I".codePoints() ;

处理每个代码点编号。在这里,我们只需打印每个数字。

intStream.forEach( System.out :: println );

运行时。

83
49
50
51
52
53
54
55
73

或者您可能想要一个int数字数组。

int[] codePoints = "S1234567I".codePoints().toArray();

转储到控制台。

System.out.println( "codePoints = " + Arrays.toString( codePoints ) );

codePoints = [83、49、50、51、52、53、54、55、73]

或者也许您想要一个List对象,其中包含所有这些代码点编号。这是List.of制作的不可修改的列表。我们调用boxed来调用auto-boxing功能,将int原语转换为Integer对象。然后Collector实现将流的输出收集到List中。

List < Integer > codePoints = "S1234567I".codePoints().boxed().collect( Collectors.toList() );

解释这些部分:

List < Integer > codePoints =      // Desired result is a `List` collection of `Integer` objects.
    "S1234567I"                    // Your input string.
        .codePoints()              // Generate an `IntStream`, a succession of `int` integer numbers representing the Unicode code point number of each character in the `String` object. 
        .boxed()                   // Convert each `int` primitive to an `Integer` object.
        .collect(                  // Collect the produced `Integer` objects together.
            Collectors.toList()    // Specify a `Collector` implementation that knows how to make a `List` object, containing our `Integer` objects.
        )                          // Returns a `List` of `Integer` objects.
;

全位数

也许您想filter除去字母字符,只保留在输入字符串中找到的数字。 Character类提供诸如isDigit之类的测试。

对于输入"S1234567I",这意味着将SI删除,留下1234567,产生整数1,234,567。

List < Integer > codePointsOfDigitsFromInput = "S1234567I".codePoints().filter( ( int codePoint ) -> Character.isDigit( codePoint ) ).boxed().collect( Collectors.toList() );

将其分成多行。

List < Integer > codePointsOfDigitsFromInput =
        "S1234567I"
                .codePoints()
                .filter(
                        ( int codePoint ) -> Character.isDigit( codePoint )
                )
                .boxed()
                .collect( Collectors.toList() );

codePointsOfDigitsFromInput = [49、50、51、52、53、54、55]

我们可以修改该代码以生成String,其中仅包含从该输入中提取的数字。请参阅问题Make a string from an IntStream of code point numbers?。然后,我们为该文本生成一个int整数。

String numberComponentFromInput =
        "S1234567I"
                .codePoints()
                .filter(
                        ( int codePoint ) -> Character.isDigit( codePoint )
                )
                .collect(                                    // Collect the results of processing each code point.
                        StringBuilder :: new ,                  // Supplier<R> supplier
                        StringBuilder :: appendCodePoint ,      // ObjIntConsumer<R> accumulator
                        StringBuilder :: append                // BiConsumer<R,​R> combiner
                )
                .toString();
int x = Integer.valueOf( numberComponentFromInput );

numberComponentFromInput = 1234567

x = 1234567

答案 5 :(得分:-1)

int indiv1 = Integer.parseInt(nric.charAt(1));