加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

IDL语言中format详解

(2014-12-08 18:46:31)
标签:

股票

分类: ENVI IDL ERDAS

Format这个关键字在IDL应用过程中无处不在,Format代码(Format codes)有两种:
    一种用于在数据的输入输出、类型转换过程中,是最经常用到一种方法。我们常听到诸如float型小数点没有显示全、科学计数格式转换、输出的时候字符怎么对齐,字符宽度设置、二进制、8进制、10进制、16进制怎么转换等等都和这种用法有关。功能很强大,也是大家容易晕的地方。
而且目前市面的IDL书和帮助介绍的都不全面,有些书还有严重的谬误。所以这里对Format做了全面整理详细全面介绍了format的含义以及format的各种用法。
    二种是用于嵌入到字符串中,用于字符格式控制。如字体选择、上标、下标控制等。用在直接图形发xyouts,对象IDlgrtext widget界面组件里。以后再做介绍。
一、基本语法介绍

IDLformat语法结构如下:
[N] FC[+][-][width]

符号 描述
N 代表格式控制的重复次数,默认是1
FC format codes的简写,格式控制代码
+ 给正数加上前缀
- 控制输出时对齐方向
Width
Width是输出字符的宽度

看着上面的语法结构,谁都有点晕。让我们来详细解释一下:
1.N 代表格式控制的重复次数,默认是:

默认1的情况

  1. IDL> print,FORMAT='(I12)', [300,400,500]
  2.          300
  3.          400
  4.          500

   重复3次情况

  1. IDL> print,FORMAT='(3I12)', [300,400,500]
  2.          300         400         500

2.FC format codes的简写,格式控制代码也就是你需要实现的功能的格式控制码, 这个在下面做最详细介绍
3.+ 给正数加上前缀如果是正数输出的时候在数字前面加上一个’+’。这个+符号只有在数字的格式化输出的时候才有效。不是十进制的数字输出的时候也可以加,不过没啥效果
例:没有+情况 

  1. IDL> print,FORMAT='(I12)', [300,-300]
  2.          300
  3.         -300

+号情况 

  1. IDL> print,FORMAT='(I+12)', [300,-300]
  2.         +300
  3.         -300

4. 控制输出时对齐方向 也是可选符号,加了-符号字符和数字输出的时候是左对齐,默认是右对齐,例:
默认情况

  1. IDL> print,FORMAT='(2I12)', [300,-300]
  2.          300        -300

加上- 

  1. IDL> print,FORMAT='(2I-12)', [300,-300]
  2. 300         -300    

5.Width是输出字符的宽度。如果定义的宽度超出输出字符宽度,不补0或空格
       1.默认情况如果格式输出定义宽度超过字符宽度是补空格的

  1. IDL> print,FORMAT='(a10)','abc'
  2.        abc
  3. IDL> print,FORMAT='(I10)','400'
  4.        400

2.在对数字输出的时候,如果在宽度前面加0。超出部分就会补0

  1. IDL> print,FORMAT='(I010)','400'
  2. 0000000400

3.自然宽度输出:如果定义width0的话。在值的读取和输出时候采用自然宽度,也是数字默认格式宽度是多少就按多少读取和输出。对字符宽度不定情况,非常有用。例如读取表格数据。

  1. a=[26.0001, 92.555, 344.2,101.0 ,6.123, 99.845,23.723 ,200.02111 ,141.93]
  2. IDL> print,a
  3. 26.0100   92.5550   344.200  101.000  6.12300   99.8450  23.7230  200.020 141.930
  4. IDL> print,FORMAT='(f0)',a
  5. 26.010000
  6. 92.555000
  7. 344.200012
  8. 101.000000
  9. 6.123000
  10. 99.845001
  11. 23.723000
  12. 200.020004
  13. 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
/
换行输出

Format codes13种详细用法如下:
1.A 字符操作
用于字符的格式化输出 ,用于print/printf.语法:[n]A[-][w]
n,-,w见基本语法介绍
例子:1.输出宽度6字符
 
  1. IDL> PRINT, FORMAT = '(A6)', '123456789'
  2. 123456

2.: 输出分割符操作

冒号“:“用于每个参数输出时的分割符的设定。默认是空格分隔。 

IDL> a=[200.1,11,30.4,56,001,300.6]  
  1. IDL> PRINT, FORMAT = '(6(I))', a
  2.          200          11          30          56                   300

用逗号分割 

  1. IDL> PRINT, FORMAT = '(6(I,:,","))', a
  2.          200,          11,          30,          56,           1,         300


3.  抑制换行符

$符号用于抑制换行符的输出。在使用print在控制台输出和用printf向文本输出数据的时候。IDL默认是自动换行的。如: 

  1. IDL> str1='a'
  2. IDL> str2='b'
  3. IDL> print,str1 & print,str2
  4. a
  5. b
    可以看出打印完a就就自动换行了。对输出a进行抑制换行符输出:
  1. IDL> print,format='( $,a )' ,str1 & print,str2
  2. ab
4.F, D, E, G浮点数操作
这四个格式符都是用于浮点数的输出和输入。
语法: 

 [n]F[+][-][w][.d]

 [n]D[+][-][w][.d]

 [n]E[+][-][w][.d][Ee]

 [n]G[+][-][w][.d][Ee]


F是定点计数法来输出浮点型(单精度和双精度)数值。把数值四舍五入到d的精度,保留w个字符宽度
DF功能完全是一样的,主要是兼容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>
a=100.

IDL> print,a,format='(f)'

100.0000000000000000

 

IDL>
a=100.

 

IDL> print,a,format='(f10.3)'
100.000

ID>
a=100.

 

IDL> print,a,format='(f2.3)'

 

**

E

 

IDL>
a=100.

 

IDL> print,a,format='(e11.4)'

 

 

1.0000e+002

IDL>
a=100.

IDL> print,a,format='(E11.4)'

1.0000E+002

 

G

IDL>
a=100.

IDL> print,a,format='(g10.4)'

100.0

 

IDL>
a=10000000.
 

IDL> print,a,format='(g10.4)'

1.000e+007

 
5.B, I, O, Z进制转换操作
用于对整形数值的输出。可以用来对二进制、十进制、八进制、十六进制转换。
B输出2进制数;I输出10进制数;O输出8进制数;Z输出16进制数
语法 

[n]B[-][w][.m]  

[n]I[+][-][w][.m]  

[n]O[-][w][.m] 

[n]Z[-][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)'
12

IDL> a=10 

IDL> print,a,format='(o-6)' 

12

Z

IDL> a=10 

IDL> print,a,format='(Z6)'
A

 

IDL> a=5000

IDL> print,a,format='(Z10)'
1388

IDL> a=5000 

IDL> print,a,format='(Z3)' 

***


6.Q计数操作
Q很有意思,它是在读数据时,返回当前行的字符个数。如果你想得到文件中一行的个数,这个会很有用。

例如:
数据data.txt,有三行保存以下数据。
12345
1234567
123456789
程序如下:

  1. Pro  test
  2. file = 'E:testdata.txt'
  3. openr,lun,file,/get_lun
  4. WHILE(~ EOF(lun)) DO BEGIN
  5.        READF, lun, CUR, FORMAT = '(q)'
  6.        print,CUR
  7. ENDWHILE
  8. free_lun,lun
  9. End
结果如下:
5.00000
7.00000

9.00000
7.字符串和H字符直接输出操作
这个用途是直接输出字符串。IDL提供了两种方法。
第一是直接用双引号引起来可以直接输出字符串 
  1. IDL> PRINT, FORMAT = '("Value: ", I0)', 23
  2. Value: 23 

 "Value: ",就是直接输出了。


第二种方法是用H格式符

  1. IDL> PRINT, FORMAT = '(7HValue: , I0)', 23
  2. Value: 23

  H后面的字符就直接输出了。7表示的是输出字符个数是多少,必须和字符串个数相等。
8.T输出位置操作

T用于字符输出时候得绝对位置
语法Tn
n表示的是字符的位置

  1. IDL> PRINT, FORMAT = '("First", T4, "Middle")'
  2. FirMiddle
  3. IDL> PRINT, FORMAT = '("First", T8, "Middle")'
  4. First  Middle
  5. IDL> PRINT, FORMAT = '("First", T10, "Middle")'
  6. First    Middle 

注意:T符号和TL, TR, X不同,T定义的是绝对位置,TL, TR, X定义的是字符偏移量。 

  1. IDL> PRINT, FORMAT = '("First", 20X, "Last", T10, "Middle")'
  2. First    Middle          Last 

 9.TL输出左平移操作

Tl的用途是把字符从当前位置向左移动。一般用于输入相同数据两次或不连续输出数据

  1. IDL> PRINT, FORMAT = '("First", 20X, "Last", TL15, "Middle")'
  2. First         Middle     Last 
10.TR ,X输出右平移操作
Trz作用和Tl相反,是把字符从当前位置向右移动。一般用于输出时输出空格,在输入时跳过不需要的数据。
语法:TRn , nX
  1. IDL> PRINT, FORMAT = '("First", 15X, "Last")'
  2. First               Last
  3. IDL> PRINT, FORMAT = '("First", TR15, "Last")'
  4. First               Last

  TRX区别在与在一行输出的结尾不会生产多余的空格输出。

  1. IDL> PRINT, FORMAT = '("First", 15X)'
    First
  2. DL> PRINT, FORMAT = '("First", TR15)'

First bbbbbbbbbbbbbbb

 b用来代表空格

11.C()时间输出操作
用于输出日期数据。
语法[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

  1. IDL> PRINT, FORMAT='(C(CYI))', SYSTIME(/JULIAN)
  2. 2010 

我想输出当前月 

  1. IDL> PRINT, FORMAT='(C(cmoa))', SYSTIME(/JULIAN)
  2. Apr 

输出年:月:日 

  1. IDL> PRINT, FORMAT='(C(CYI,":",CMOI,":",CDi))', SYSTIME(/JULIAN)
  2. 2010: 4:12

输出时间 

  1. IDL> PRINT,  FORMAT='(C(CHI2.2,":",CMI2.2,":",CSF05.2))',SYSTIME(/JULIAN)
  2. 22:39:32.00

输出上午下午

 IDL> PRINT, FORMAT='(C(CAPA))', SYSTIME(/JULIAN)

 
PM恩当前是下午 

 IDL> PRINT, FORMAT='(C(CApA))', SYSTIME(/JULIAN)

Pm格式符大小写改变,输出也变了。

12.C printf-Stylec系语言风格的格式化操作使用

IDL提供人性化设计,生怕用惯了C系语言的使用者,不习惯IDLFortran的格式输出方式。所以IDL还兼容了C系语言的格式化输出方式。C系的格式化输出文字和格式化代码都放在一个字符串里。IDL中使用c风格的格式化代码,需要使用%符做前缀。

正常风格格式输出 

  1. IDL> PRINT, FORMAT='("I have ", I0, " monkeys, ", A, ".")',  23, 'Scott'
  2. I have 23 monkeys, Scott.
C风格输出
  1. IDL> PRINT, FORMAT='(%"I have %d monkeys, %s.")', 23, 'Scott'
  2. I have 23 monkeys, Scott.
C风格语法与正常语法比较如下:

这里还支持转义字符
  1. print, format='(%"I have n %d monkeys")', 5
  2. I have
  3. 5 monkeys


13./ 换行符

/用于输出时候换行。本来这个不应该放在最后说明,只是帮助里实在找不到/符号的说明,但是它又的确可以用。

正常输出 

  1. IDL> print, [5,4]
  2.              4
  3. IDL> print, format='(/I)', [5,4]
  4.       5
  5.       4

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有