如何在Scheme中将字符串转为数字且保留前导零?
在Scheme中保留前导零的数字表示问题
首先得明确:数字类型本身不存储前导零这类格式信息。string->number函数的作用是把字符串解析成对应的数值,"01"和"1"在数值上完全等价,所以转换后都会得到1——这是数字的本质特性,没法让数字本身带上前导零。
如果你的需求是要保留带前导零的形式,得从字符串层面处理,或者在输出/使用时格式化:
如果你只是需要保留原始的带前导零的字符串,直接用原字符串就行,没必要转成数字。
如果你必须转成数字处理,之后又需要输出带前导零的格式,可以用格式化输出函数。比如在Racket(Scheme的方言)里,可以用
format函数指定格式:(format "~2d" (string->number "01")) ; 输出字符串"01"这里
~2d表示把数字格式化为宽度为2的十进制字符串,不足的部分用前导零填充。如果你用的是标准Scheme,没有内置的格式化函数,可以自己写一个简单的字符串补零函数,比如:
(define (pad-zero num width) (let ((s (number->string num))) (if (< (string-length s) width) (string-append (make-string (- width (string-length s)) #\0) s) s))) (pad-zero (string->number "01") 2) ; 返回"01"
总结一下:数字本身没有前导零,要保留这种格式只能在字符串层面处理,要么不转数字,要么转数字后再格式化为带前导零的字符串。
内容的提问来源于stack exchange,提问作者Bianca
相关产品推荐
相关产品推荐

