我想输入我的nirc
号码,例如S1234567I
,然后将1234567
个体化为indiv1
整数,charAt(1)
,indiv2
为charAt(2)
,indiv
为{{{ 1}}等等。但是,当我使用下面的代码时,我似乎无法得到第一个数字?有什么想法吗?
charAt(3)
答案 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)
现代的解决方案使用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
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"
,这意味着将S
和I
删除,留下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));