10 Stimmen

Java: charAt in int umwandeln?

Ich möchte meinen Schlüssel eingeben nirc Nummer z.B. S1234567I und setzen dann 1234567 individuell als Ganzzahl als indiv1 como charAt(1) , indiv2 como charAt(2) , indiv como charAt(3) , usw. Wenn ich jedoch den unten stehenden Code verwende, bekomme ich nicht einmal die erste Zahl heraus? Irgendeine Idee?

  Scanner console = new Scanner(System.in);
  System.out.println("Enter your NRIC number: ");

  String nric = console.nextLine();

  int indiv1 = nric.charAt(1);
  System.out.println(indiv1);

23voto

Jon Skeet Punkte 1325502

Sie werden 49, 50, 51 usw. erhalten - das sind die Unicode-Codepunkte für die Zeichen '1', '2', '3' usw.

Wenn Sie wissen dass es sich um westliche Ziffern handelt, können Sie einfach eine '0' abziehen:

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

Sie sollten dies jedoch erst tun, nachdem Sie bereits an anderer Stelle überprüft haben, dass die Zeichenkette das richtige Format hat - andernfalls erhalten Sie falsche Daten, z. B. würde "A" am Ende 17 zurückgeben, anstatt einen Fehler zu verursachen.

Eine Möglichkeit ist natürlich, die Werte zu nehmen und dann zu prüfen, ob die Ergebnisse im Bereich 0-9 liegen. Eine Alternative ist die Verwendung von:

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

Dies gibt -1 zurück, wenn es sich bei dem Zeichen nicht um eine geeignete Ziffer handelt.

Ich bin mir nicht sicher, ob der letztgenannte Ansatz auch nicht-westliche Ziffern abdeckt - der erste sicher nicht -, aber es klingt, als wäre das in Ihrem Fall kein Problem.

5voto

starblue Punkte 53167

Werfen Sie einen Blick auf Zeichen.getNumericValue(ch) .

1voto

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

1voto

Basil Bourque Punkte 256611

Tl;dr

Die moderne Lösung verwendet Unicode-Codepunkt Zahlen und nicht die veralteten char type.

Hier ist ein IntStream eine aufeinanderfolgende Folge von Codepunktnummern für jedes Zeichen und gibt jede dieser Nummern auf der Konsole aus:

"S1234567I"
.codePoints()
.forEach( System.out :: println )

83
49
50
51
52
53
54
55
73

Zeigen Sie jedes Zeichen zusammen mit seiner Codepunktnummer an. Um eine Codepunktnummer wieder in ein Zeichen umzuwandeln, rufen Sie Character.toString bei der Übergabe der Ganzzahl: Character.toString( codePoint ) .

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

und

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-Codepunkt

Le site char ist veraltet und kann nicht einmal die Hälfte der 143.859 Zeichen darstellen, die in Unicode . その char Typ ist ein 16-Bit darunter liegende Zahl, die einen Zahlenbereich von etwa ± 64.000 darstellen kann. Unicode-Zeichen werden Zahlen in einem Bereich von etwa einer Million zugeordnet, zu groß für char zu handhaben.

Verwenden Sie stattdessen Unicode Codepunkt Ganzzahlige Zahlen zur Darstellung einzelner Zeichen.

Wir können einen Strom von int primitive Werte ( IntStream ) aus einer Zeichenkette, wobei jede Zahl den Unicode-Codepunkt jedes aufeinanderfolgenden Zeichens darstellt.

IntStream intStream = "S1234567I".codePoints() ;

Verarbeiten Sie jede Codepunktnummer. Hier drucken wir einfach jede Nummer.

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

Wenn ausgeführt.

83
49
50
51
52
53
54
55
73

Oder vielleicht wollen Sie ein Array der int Zahlen.

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

Dump auf die Konsole.

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

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

Oder vielleicht möchten Sie eine List Objekt, das alle diese Codepunktnummern enthält. Hier ist eine nicht änderbare Liste, die von List.of . Wir nennen boxed aufzurufen auto-boxing Funktion zum Konvertieren int Primitive in Integer Objekte. Dann wird ein Collector Implementierung sammelt die Ausgabe des Streams in einem List .

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

Diese Teile zu erklären:

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.
;

Ziffern ziehen

Vielleicht möchten Sie Filter die alphabetischen Zeichen heraus, so dass nur die Ziffern übrig bleiben, die in der Eingabezeichenfolge enthalten sind. Die Character Klasse bietet Tests wie isDigit .

Bei einer Eingabe von "S1234567I" bedeutet dies, dass die S und die I verlassen. 1234567 und ergibt die ganzzahlige Zahl 1.234.567.

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

Verteilen Sie das auf mehrere Zeilen.

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

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

Wir können diesen Code ändern, um eine String die nur Ziffern aus dieser Eingabe enthält. Siehe Frage, Eine Zeichenkette aus einem IntStream von Codepunktnummern erstellen? . Und dann machen wir eine int Ganzzahlige Nummer des Textes.

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 );

ZahlKomponenteAusEingabe = 1234567

x = 1234567

0voto

shareef Punkte 8526

Ich weiß, Frage ist über Char zu int, aber dies erwähnenswert, weil es negative in Char zu ))

Von JavaHungry müssen Sie die negativen Zahlen für Integer beachten wenn Sie Character nicht verwenden wollen.

Konvertierung von String in Integer: Pseudo-Code

   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;
    }   
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X