8月更文挑战|Flutter之Dart基础:进制转换、与字符串互转

1,997 阅读2分钟

这是我参与8月更文挑战的第1天

今天要介绍的是在Dart中二进制、八进制、十进制、十六进制之间的转换,String和int之间的转换。

进制转换

String toRadixString(int radix);

返回值是一个代表当前进制的字符串。

radix 代表要转换的进制,从2到36,代表能转换为2进制到36进制。如果传入的进制不在这个范围,会直接报异常。

比如转换为37进制。

20.toRadixString(37);

运行会直接报以下异常,提示传入的进度不在2到36之间。

Unhandled exception:
RangeError (radix): Invalid value: Not in inclusive range 2..36: 37
#0      int.toRadixString (dart:core-patch/integers.dart:331:7)
#1      main (package:flutter_app/demo.dart:5:20)
#2      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:283:19)
#3      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:184:12)

转二进制

/// 申明10进制数
int num = 20;
/// 传入2
var binary = num.toRadixString(2);
print("20的二进制为 $binary")
// 打印结果: 20的二进制为 10100

转八进制

/// 申明10进制数
int num = 20;
/// 传入8
var binary = num.toRadixString(8);
print("20的八进制为 $binary")
// 打印结果: 20的八进制为 24

转十进制

/// 申明16进制数
int num = 0xd1;
/// 传入10
var binary = num.toRadixString(10);
print("20的十进制为 $binary")
// 打印结果: d1的十进制为 209

其实其他进制不需要转换为10进制,因为在打印或者跟10进制数运算时,Dart会自动转换为10进制。

转十六进制

/// 申明16进制数
int num = 20;
/// 传入10
var binary = num.toRadixString(16);
print("20的十六进制为 $binary")
// 打印结果: 20的十六进制为 14

String与int互转

int转String

直接使用toString()

int num = 20;
var s = num.toString();

String转int

使用int的parsetryParse方法

external static int parse(String source,
      {int? radix, @deprecated int onError(String source)?});
external static int? tryParse(String source, {int? radix});

radix是要转换的进制,默认为将String转换为10进制数。

String s = "20";
var i = int.parse(s);
/// 两者都可以
// var i = int.tryParse(s);

parse和tryParse区别

区别是遇到转换异常时的处理方式。

parse

使用parse的转换异常需要在onError回调中处理。如果onError为null,会直接造成程序崩溃。

String s = "20";
var i = int.parse(s, radix: 2);

比如将20的字符串转换为2进制形式的int,如果没有传入onError,会报以下异常信息。

Unhandled exception:
FormatException: Invalid radix-2 number (at character 1)
20
^
​
#0      int._throwFormatException (dart:core-patch/integers_patch.dart:132:5)
#1      int._parseRadix (dart:core-patch/integers_patch.dart:143:16)
#2      int._parse (dart:core-patch/integers_patch.dart:101:12)
#3      int.parse (dart:core-patch/integers_patch.dart:64:12)
#4      main (package:flutter_app/demo.dart:4:15)
#5      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:283:19)
#6      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:184:12)
使用onError
String s = "20";
​
var i = int.parse(s, radix: 2,onError: (source){
  print("需要转换的字符串 $source");
  /// 返回一个int。
  return -1;
});
​
print("转换结果为 $i");
​
if (i == -1) {
  print("转换失败");
}

int onError(String source)

source是原始字符串。

返回值是一个指定的int值,转换后可以检查结果是否是这个值,来判断是否转换成功。

tryParse

官方已经将onError淘汰了,因为处理的方式不够优雅,而且使用时忘记使用onError导致程序崩溃那就得不偿失了。

对于不确定是否能正常转换的字符串,推荐使用tryParse进行转换。不需要处理异常,只需要判断返回值是否为null即可。

String s = "20";
​
var i = int.tryParse(s, radix: 2);
​
print("转换结果为 $i");
// 值为null,代表转换失败。
if (i == null) {
  print("转换失败");
  return;
}