IDL语言中format详解
(2014-12-08 18:46:31)
标签:
股票 |
分类: ENVI IDL ERDAS |
Format这个关键字在IDL应用过程中无处不在,Format代码(Format
codes)有两种:
而且目前市面的IDL书和帮助介绍的都不全面,有些书还有严重的谬误。所以这里对Format做了全面整理详细全面介绍了format的含义以及format的各种用法。
一、基本语法介绍
IDL的format语法结构如下:
[N]
FC[+][-][width]
| 符号 | 描述 |
| N | 代表格式控制的重复次数,默认是1 |
| FC | 即format codes的简写,格式控制代码 |
| + | 给正数加上前缀 |
| - | 控制输出时对齐方向 |
|
Width |
Width是输出字符的宽度 |
看着上面的语法结构,谁都有点晕。让我们来详细解释一下:
1.N
默认1的情况
- IDL> print,FORMAT='(I12)', [300,400,500]
-
300 -
400 -
500
- IDL> print,FORMAT='(3I12)', [300,400,500]
-
300 400 500
2.FC
3.+
例:没有+情况
- IDL> print,FORMAT='(I12)', [300,-300]
-
300 -
-300
有+号情况
- IDL> print,FORMAT='(I+12)', [300,-300]
-
+300 -
-300
4.–
默认情况
- IDL> print,FORMAT='(2I12)', [300,-300]
-
300 -300
加上-
- IDL> print,FORMAT='(2I-12)', [300,-300]
-
300
-300
5.Width是输出字符的宽度。如果定义的宽度超出输出字符宽度,不补0或空格
- IDL> print,FORMAT='(a10)','abc'
-
abc - IDL> print,FORMAT='(I10)','400'
-
400
2.在对数字输出的时候,如果在宽度前面加0。超出部分就会补0
- IDL> print,FORMAT='(I010)','400'
- 0000000400
3.自然宽度输出:如果定义width是0的话。在值的读取和输出时候采用自然宽度,也是数字默认格式宽度是多少就按多少读取和输出。对字符宽度不定情况,非常有用。例如读取表格数据。
- a=[26.0001, 92.555, 344.2,101.0 ,6.123, 99.845,23.723 ,200.02111 ,141.93]
- IDL> print,a
-
26.0100
92.5550 344.200 101.000 6.12300 99.8450 23.7230 200.020 141.930 - IDL> print,FORMAT='(f0)',a
- 26.010000
- 92.555000
- 344.200012
- 101.000000
- 6.123000
- 99.845001
- 23.723000
- 200.020004
- 141.929993
二、Format
codes
IDL中支持Format codes代码有13种用法。如下表所示:
| num | Format Code | 描述 | 使用范围 |
| 1 | A | 用于字符的输出 |
|
| 2 | : | 冒号用于输出时终止符号的处理 |
|
|
3 |
$ |
用于禁止输出换行符 |
|
|
4 |
F, D, E,
G |
用于浮点数的输入、输出 |
|
|
5 |
B, I, O,
Z |
用于整形数的输入、输出的格式转换。B是进制
I为十进制 o是八进制 z为16进制 |
|
|
6 |
Q |
在进行读取时,返回每一行的字符数 |
|
|
7 |
字符串和H |
用引用字符 或
H直接输出字符 |
|
|
8 |
T |
定义输出字符的绝对位置 |
|
|
9 |
TL |
把当前的字符位置向后(左)移动 |
|
|
10 |
TR
,X |
把当前的字符位置向前(右)移动 |
|
|
11 |
C() |
用于输出日期数据(Julian
data格式 ,/ 格式,时间格式) |
|
|
12 |
C
printf-Style |
提供c系语言风格的格式输出,为熟悉c语言输准备。 |
|
|
13 |
/ |
换行输出 |
|
1.A
n,-,w见基本语法介绍
例子:1.输出宽度6字符
- IDL> PRINT, FORMAT = '(A6)', '123456789'
- 123456
2.:
冒号“:“用于每个参数输出时的分割符的设定。默认是空格分隔。
- IDL> PRINT, FORMAT = '(6(I))', a
-
200 11 30 56 1 300
用逗号分割
- IDL> PRINT, FORMAT = '(6(I,:,","))', a
-
200, 11, 30, 56, 1, 300
3.
$符号用于抑制换行符的输出。在使用print在控制台输出和用printf向文本输出数据的时候。IDL默认是自动换行的。如:
- IDL> str1='a'
- IDL> str2='b'
- IDL> print,str1 & print,str2
- a
-
b
可以看出打印完a就就自动换行了。对输出a进行抑制换行符输出:
- IDL> print,format='( $,a )' ,str1 & print,str2
- ab
F是定点计数法来输出浮点型(单精度和双精度)数值。把数值四舍五入到d的精度,保留w个字符宽度
D和F功能完全是一样的,主要是兼容FORTRAN语言习惯。让给习惯使用FORTRAN的人提供便利。
E以指数形式(科学格式)输出浮点数,把数值四舍五入到d的精度,保留w个字符宽度
G根据数据大小自动选择科学格式E或者F格式输出
对浮点格式化输出,IDL提供默认字符宽度和精度
| 数据类型 | W默认字符宽度 | d默认小数点精度位数 |
| Float, Complex | 15 | 7 |
| Double | 25 | 16 |
|
All
Other Types |
25 |
16 |
| 格式字符 | 使用范例 |
|
F/D |
IDL>
a=100. IDL> print,a,format='(f)' 100.0000000 |
|
IDL> IDL> print,a,format='(f)' 100.0000000000000000 |
|
|
IDL>
IDL>
print,a,format='(f10.3)' |
|
|
ID>
IDL> print,a,format='(f2.3)'
** |
|
| E |
IDL>
IDL> print,a,format='(e11.4)'
1.0000e+002 |
|
IDL> IDL> print,a,format='(E11.4)' 1.0000E+002 |
|
|
G |
IDL> IDL> print,a,format='(g10.4)' 100.0 |
|
IDL> IDL> print,a,format='(g10.4)' 1.000e+007 |
B输出2进制数;I输出10进制数;O输出8进制数;Z输出16进制数
语法
[n]B[-][w][.m]
[n]I[+][-][w][.m]
[n]O[-][w][.m]
| 格式字符 | 使用范例 |
|
B |
IDL>
a=10
IDL>
print,a,format='(b)' 1010 |
|
IDL> a=1000 IDL> print,a,format='(b15)' 1111101000 |
|
|
I |
IDL> a=1000 IDL> print,a,format='(I)' 1000 |
|
IDL> a=1000 IDL> print,a,format='(I10)' 1000 IDL> print,a,format='(I15)' 1000 IDL> print,a,format='(I3)'
*** |
|
|
O |
IDL>
a=10
IDL>
print,a,format='(o)' |
|
IDL>
a=10
IDL>
print,a,format='(o-6)'
12 |
|
|
Z |
IDL>
a=10
IDL>
print,a,format='(Z6)' |
|
IDL> a=5000
IDL>
print,a,format='(Z10)' |
|
|
IDL>
a=5000
IDL>
print,a,format='(Z3)' *** |
6.Q计数操作
例如:
数据data.txt,有三行保存以下数据。
12345
1234567
123456789
程序如下:
-
Pro
test - file = 'E:testdata.txt'
- openr,lun,file,/get_lun
- WHILE(~ EOF(lun)) DO BEGIN
-
READF, lun, CUR, FORMAT = '(q)' -
print,CUR - ENDWHILE
- free_lun,lun
- End
5.00000
7.00000
9.00000
第一是直接用双引号引起来可以直接输出字符串
- IDL> PRINT, FORMAT = '("Value: ", I0)', 23
-
Value: 23
第二种方法是用H格式符
- IDL> PRINT, FORMAT = '(7HValue: , I0)', 23
- Value: 23
8.T输出位置操作
T用于字符输出时候得绝对位置
语法Tn
n表示的是字符的位置
- IDL> PRINT, FORMAT = '("First", T4, "Middle")'
- FirMiddle
- IDL> PRINT, FORMAT = '("First", T8, "Middle")'
-
First
Middle - IDL> PRINT, FORMAT = '("First", T10, "Middle")'
-
First
Middle
注意:T符号和TL, TR,
X不同,T定义的是绝对位置,TL, TR,
X定义的是字符偏移量。
- IDL> PRINT, FORMAT = '("First", 20X, "Last", T10, "Middle")'
-
First
Middle Last
Tl的用途是把字符从当前位置向左移动。一般用于输入相同数据两次或不连续输出数据
- IDL> PRINT, FORMAT = '("First", 20X, "Last", TL15, "Middle")'
-
First
Middle Last
- IDL> PRINT, FORMAT = '("First", 15X, "Last")'
-
First
Last - IDL> PRINT, FORMAT = '("First", TR15, "Last")'
-
First
Last
-
IDL> PRINT, FORMAT = '("First", 15X)'
First - DL> PRINT, FORMAT = '("First", TR15)'
First
语法[n]C([c0,c1,...,cx])
C(CDwA, X, CMoA, X, CDI, X, CHI, X, CMI, X, CSI, CYI5)
输出时默认格式
C(CDwA, X, CMoA, X, CDI2.2, X, CHI2.2, ":", CMI2.2, ":", CSI2.2,CYI5)
看着挺复杂吧,其实挺加到你看我慢慢解释
CMOA
CMOI
CDI天,想输出天的时候就用它
CYI年,想输出年的时候就用它
CHI时,想输出时的时候就用它
CMI分,想输出分的时候就用它
CSI秒,想输出秒的时候就用它
CSF带小数点的秒,想输出秒的时候就用它
CDWA,想输出周的时候就用它。有CDWA CdWA CdwA
CAPA,想输出(上午下午)的时候就用它。有CAPA CaPA CapA,输出结果大小写不一样:
1.默认输出当前时间
IDL> PRINT, FORMAT='(C())', SYSTIME(/JULIAN)
Mon Apr 12 22:29:25 2010
我想输出当前年,在c()里加上CYI
- IDL> PRINT, FORMAT='(C(CYI))', SYSTIME(/JULIAN)
-
2010
我想输出当前月
- IDL> PRINT, FORMAT='(C(cmoa))', SYSTIME(/JULIAN)
-
Apr
输出年:月:日
- IDL> PRINT, FORMAT='(C(CYI,":",CMOI,":",CDi))', SYSTIME(/JULIAN)
- 2010: 4:12
输出时间
-
IDL>
PRINT,
FORMAT='(C(CHI2.2,":",CMI2.2,":",CSF05.2))',SYSTIME(/JULIAN) - 22:39:32.00
输出上午下午
12.C printf-Stylec系语言风格的格式化操作使用
IDL提供人性化设计,生怕用惯了C系语言的使用者,不习惯IDL和Fortran的格式输出方式。所以IDL还兼容了C系语言的格式化输出方式。C系的格式化输出文字和格式化代码都放在一个字符串里。IDL中使用c风格的格式化代码,需要使用%符做前缀。
正常风格格式输出
-
IDL> PRINT, FORMAT='("I have ", I0, " monkeys, ", A,
".")',
23, 'Scott' - I have 23 monkeys, Scott.
- IDL> PRINT, FORMAT='(%"I have %d monkeys, %s.")', 23, 'Scott'
- I have 23 monkeys, Scott.
这里还支持转义字符
- print, format='(%"I have n %d monkeys")', 5
- I have
- 5 monkeys
13./
/用于输出时候换行。本来这个不应该放在最后说明,只是帮助里实在找不到/符号的说明,但是它又的确可以用。
正常输出
- IDL> print, [5,4]
-
5 4 - IDL> print, format='(/I)', [5,4]
-
5 -
4

加载中…