文档库 最新最全的文档下载
当前位置:文档库 › tcl的进制转换

tcl的进制转换

TCL语言的语法非常简单,只有一种数据类型,那就是String,因此没有数字的概念,所以数字的处理都需要借助一些方法进行。以前写过一个进制之间的相互转换的方法,是最基本的API,支持十进制到其他进制之间的转换。贴出来,供大家参考一下:
用法很简单,两个参数,第一个参数是十进制的值,第二个参数是进制,比如你要把100转成8进制,只要按照下面的方法调用即可:

dec2bin 100 8


proc dec2bin {dec change} {

set bin “”
set a 1
while {$a>0} {
set a [expr $dec/$change]
set b [expr $dec%$change]
set dec $a
set bin $b$bin
}
set len [string length $bin]
if {$len < 8 } {
for {set i 0} {$i<[expr 8-$len]} {incr i} {
set bin 0$bin
}
}
return $bin
}
另外,针对其他进制的转换,都可以利用TCL的方法format和scan进行。比如把一直16进制转成10进制就可以这么写:

set hex 0x3a
scan $hex %x decimal
puts $decimal
这样就把hex转成了十进制。其他类型的转换可以参考TCL的format方法帮助。

*************************************************************************

format ----按照sprintf方式格式化字符串

语法:
format formatString ?arg arg ...?

介绍:
该命令按照ANSI C 的sprintf函数返回一个格式化的字符串。formatString表示格式化的结果,使用%作为转换符,返回值为格式化的字符串.

格式化细节:
该命令通过自左向右扫描formatString实现操作.在遇到%之前,每个格式化的字符串被贴在后面,遇到%后,不再将其复制.而是将其作为数据类型格式转换的标志.如果存在多个转换符,则每个转换符控制一个操作数。format命令必须给出足够的操作数来对应转换符输出
每个转换符可能包含六个不同的部分:XPG3 位置标识符,字段集,最小域宽度,精度,长度修改器,转换字符.
如果%之后接一个十进制数和一个$,如"%2$d",这时被转换的值并不是取自 format命令的下一个顺序参数。而是取自数字所指定的参数,比如,1表示对应于第一个参数.在转换符中存在*的情况下表示转换符需要多个参数,此时使用连续的参数,自由数字给出的序号开始.这就可以使得XPG3用于位置转换符.如果在formatString 中存在位置符时则所有的转换符都是按位置输出的。
转换符的第二个部分可以包含任意顺序的下列字符:
- 指定被转换的参数应该左对齐(数字则是右对齐的)
+ 指定被转换的数字应该输出值的符号
空格 指定对于数字如果首字符不是符号的话在数字前面增加空格
0 指定数字应该在前面由0补齐
# 请求一个替代的输出形式.对于o和O转换来确保首个数字总是0.对于x和X转换,0x和0X(各自的)在输出结果非0时将加到结果之前。对于所有的浮点型转换

(e,E,f,g和G)确保结果总是带小数点.对于g和G转换指定尾随的0不能去除.

转换符的第三个部分是给定最小域长度的数字。一般使用表格打印的方式来排成一列.如果参数长度小于最小域长度则进行填充.填充一般通过在最左端加空格的形式执行,但是0和-也可以用于填充。如果最小域长度指定的是*而不是数字,这时format的下一个参数决定最小域长度;其必须为一个数字字符串

转换符的第四个部分是精度,由数字组成.数字通过多种方式进行多种转换.对于e,E和f,指定了在小数点右面出现的字符数.对于g和G则必须指定可显示数字的总长度,包括小数点两面的数字长度(但是小数点后面的尾随0除非在#指定否则予以忽略).对于整形数转换,指定所打印数字的最小长度(前置0在必要的时候可以添加).对于s转换,其指定了打印字符的最大长度;如果字符串长度大于规定长度,则丢掉尾随0.如果以*方式指定精度此时通过format的下一个参数指定精度;其必须为数字字符串

转换符的第五部分是长度修改器,必须为h或者l之一.如果是h则指定数字在转换之前被截断为16-bit值.这个选项不太有用.如果是l则制定数字必须为一个64-bit的值.如果h和l都没有出现,数字值被解释为本机字符的宽度,详见tcl_platform(wordSize)

转换符的最后一部分是字母字符并以此来决定做何种转换.目前支持一下的转换:
d
将整形数转换为有符号的十进制字符串

u
将整形数转换为无符号的十进制字符串

i
将整形数转换为有符号的十进制字符串;整形数可以是十进制,八进制(0)或者十六进制(0x)

o
将整形数转换为无符号的八进制字符串

x or X
将整形数转换为无符号的十六进制字符串,对于x使用``0123456789abcdef'',X则使用``0123456789ABCDEF''

c
将整形数转化为Unicode编码字符

s
无转换,只是插入字符串

f
将浮点型数字转换为有符号十进制字符串(xx.yyy形式),y的长度有精度控制(默认为6).如果精度为0时则不输出小数点
e or E
将浮点型数字转换为科学计数方式(x.yyye±zz),y由精度决定(默认为6).精度为0则不输出小数点.为E时则用E代替e
g or G
如果指数小于-4或者大于等于精度,则以%e或者%E方式转换浮点数。否则用%f转换.尾随0和小数点被忽略.
%
插入%
对于数字转换,参数必须为整形数或者浮点型数的字符串;format先将参数转换为二进制之后根据需要转换为其他形式

与ANSI Sprintf的差异:
1) 目前不支持%p和%n
2) 对于%c转换,参数必须为十进制字符串,之后被转换为相应的字符值
3) 在64-bit系统对于l 修改器是忽略的,总是以l方式转换.如果h出现则在转换之前将整形数截断为short型.


举例:
将时间输出转换为秒并精确到百分之一秒
set us [lindex [time $someTclCode] 0]
puts [format "%.2f seconds to execute" [expr {$us / 1e6}]]

创建打包的X11文字颜色规范:
# Each color-component should be in range (0..255)
set color [format "#%02x%02x%02x" $r $g $b]

使用XPG3格式码重排序(经常在本地化消息时使用的计数,键msgcat)
set fmt1 "Today, %d shares in %s were bought at $%.2f each"
puts [format $fmt1 123 "Global BigCorp" 19.37]

set fmt2 "Bought %2\$s equity ($%3$.2f x %1\$d) today"
puts [format $fmt2 123 "Global BigCorp" 19.37]

打印一张3次幂的表
# Set up the column widths
set w1 5
set w2 10

# Make a nice header (with separator) for the table first
set sep +-[string repeat - $w1]-+-[string repeat - $w2]-+
puts $sep
puts [format "| %-*s | %-*s |" $w1 "Index" $w2 "Power"]
puts $sep

# Print the contents of the table
set p 1
for {set i 0} {$i<=20} {incr i} {
puts [format "| %*d | %*ld |" $w1 $i $w2 $p]
set p [expr {wide($p) * 3}]
}

# Finish off by printing the separator again
puts $sep

相关文档