Dart/Flutter — 문자열을 숫자로 파싱하는 방법



이 게시물에서는 문자열을 숫자(정수, 이중 또는 둘 다)로 구문 분석/변환하는 몇 가지 방법을 알아보겠습니다.

1. parse() 메서드 사용(권장하지 않음)




/// Parse string to integer
int stringToInt_parse(String input) {
  return int.parse(input, onError: (error) {
    // Return null if input string is invalid.
    // Change to default value if you want.
    return null;
});

/// Parse string to double
double stringToDouble_parse(String input) {
  return double.parse(input, (error) {
    // Return null if input string is invalid.
    // Change to default value if you want.
    return null;
  });
}

/// Parse string to number
num stringToNumber_parse(String input) {
  return num.parse(input, (error) {
    // Return null if input string is invalid.
    // Change to default value if you want.
    return null;
  });
}


테스트




void main() {
  final testInt = '100';
  final testDouble = '100.1';
  final testInvalidNumber = 'a';

  print(stringToInt_parse(testInt)); // 100
  print(stringToDouble_parse(testInt)); // 100.0
  print(stringToNumber_parse(testInt)); // 100

  print(stringToInt_parse(testDouble)); // null
  print(stringToDouble_parse(testDouble)); // 100.1
  print(stringToNumber_parse(testDouble)); // 100.1

  print(stringToInt_parse(testInvalidNumber)); // null
  print(stringToDouble_parse(testInvalidNumber)); // null
  print(stringToNumber_parse(testInvalidNumber)); // null
}


메모:


  • double.parse()를 사용하여 유효한 정수 문자열을 int로 변환할 수 있지만 double을 반환합니다(7행: 100.0). 그리고 분명히 유효한 이중 문자열을 정수로 변환할 수 없으며 null을 반환합니다(10행: null).
  • num.parse()를 사용하면 프로그램은 먼저 정수로 구문 분석을 시도하고 구문 분석할 수 없는 경우(null 가져오기) double로 구문 분석을 시도합니다. (이것이 8행에서 출력이 100이지만 100.0이 아닌 이유입니다).
  • 정확한 이유는 알 수 없지만 int.parse(), double.parse() 및 num.parse()의 서명을 보면 onError가 선택적 명명 매개변수임을 알 수 있습니다. int.parse()에서는 double.parse() 및 num.parse()와 함께 선택적 위치 매개변수입니다. 🤔 🤔 🤔

  • // Look at onError:
    int.parse(input, onError: (error) {
      // ...
    });
    
    // No need onError: 
    double.parse(input, (error) {
      // ...
    });
    
    // No need onError: 
    num.parse(input, (error) {
      // ...
    });
    


  • 유효하지 않은 문자열이 있는 예외를 처리하기 위해 onError 메소드를 제공하지 않으면 프로그램이 런타임 시 예외를 발생시킵니다.

  • /// Parse string to integer without handling error 
    /// -> throw exception at runtime.
    int stringToInt_parseWithoutErrorHandle(String input) {
      return int.parse(input);
    }
    
    void main() {
      final testInvalidNumber = 'a';
      print(stringToInt_parseWithoutErrorHandle(
       testInvalidNumber)
      );
    }
    


    예외:




    Unhandled exception:
    FormatException: Invalid radix-10 number (at character 1)
    a
    ^
    
    #0      int._throwFormatException (dart:core-patch/integers_patch.dart:131:5)
    #1      int._parseRadix (dart:core-patch/integers_patch.dart:142:16)
    #2      int._parse (dart:core-patch/integers_patch.dart:100:12)
    #3      int.parse (dart:core-patch/integers_patch.dart:63:12)
    #4      stringToInt_parseWithoutErrorHandle (package:dart/core/string/string_to_number.dart:58:14)
    #5      main (package:dart/core/string/string_to_number.dart:18:9)
    #6      _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:301:19)
    #7      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
    


  • (중요) 처음에는 이 parse() 메서드가 권장되지 않는다고 강조했습니다. 다트 문서는 다음과 같이 말합니다(출처).

  • * ...
    * The [onError] parameter is deprecated and will be removed.
    * Instead of `int.parse(string, onError: (string) => ...)`,
    * you should use `int.tryParse(string) ?? (...)`.
    * ...
    


    위에서 언급했듯이 대신 tryParse() 메서드를 사용해야 합니다. 바로 그 방법으로 넘어가겠습니다.

    2. tryParse() 메서드 사용



    tryParse() 메서드를 사용할 때 입력 문자열만 제공하면 됩니다. 입력이 잘못된 경우 프로그램은 null을 반환합니다. 이것이 tryParse()와 parse()(onError 메서드를 처리하지 않으면 예외가 발생함)의 차이점입니다.

    int stringToInt_tryParse(String input) {
      return int.tryParse(input);
    }
    
    double stringToDouble_tryParse(String input) {
      return double.tryParse(input);
    }
    
    num stringToNumber_tryParse(String input) {
      return num.tryParse(input);
    }
    


    테스트




    void main() {
      final testInt = '100';
      final testDouble = '100.1';
      final testInvalidNumber = 'a';
    
      print(stringToInt_tryParse(testInt)); // 100
      print(stringToDouble_tryParse(testInt)); // 100.0
      print(stringToNumber_tryParse(testInt)); // 100
    
      print(stringToDouble_tryParse(testInt)); // 100.0
      print(stringToDouble_tryParse(testDouble)); // 100.1
      print(stringToNumber_tryParse(testDouble)); // 100.1
    
      print(stringToInt_tryParse(testInvalidNumber)); // null
      print(stringToDouble_tryParse(testInvalidNumber)); // null
      print(stringToNumber_tryParse(testInvalidNumber)); // null
    }
    


    3. (보너스) 확장 방법 사용



    확장 메서드가 무엇인지 모르는 경우 기존 라이브러리/클래스에 더 많은 기능을 추가하는 방법입니다. 우리의 경우 이 기술을 사용하여 String 클래스에 3개의 메서드를 추가합니다.

    extension StringExtension on String {
      int toInt() {
        return int.tryParse(this);
      }
    
      double toDouble() {
        return double.tryParse(this);
      }
    
      num toNumber() {
        return num.tryParse(this);
      }
    }
    


    위의 확장을 만든 후 이제 String에는 다른 종료 메서드로 사용할 수 있는 메서드가 3개 더 있습니다. 너무 멋지다! 😎 😎 😎

    void main() {
      final testInt = '100';
      final testDouble = '100.1';
      final testInvalidNumber = 'a';
    
      print(testInt.toInt()); // 100
      print(testInt.toDouble()); // 100.0
      print(testInt.toNumber()); // 100
    
      print(testDouble.toInt()); // null
      print(testDouble.toDouble()); // 100.1
      print(testDouble.toNumber()); // 100.1
    
      print(testInvalidNumber.toInt()); // null
      print(testInvalidNumber.toDouble()); // null
      print(testInvalidNumber.toNumber()); // null
    }
    


    그게 다야!
    my blog에서 원본 기사를 찾을 수 있습니다.

    좋은 웹페이지 즐겨찾기