这是我参与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的parse
或tryParse
方法
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;
}