% 标志 宽 精度 格式符号
如writefln("Item %d:%9.02f", i + 1, items[i]);
d的格式与C类似.
格式符:b,x/X,o,d
,还有e,f,g,a
Format Specifiers
s,默认
b,二进制
d,十进制
o,八进制
x/X,16进制
f/F,标准10进制格式浮点计数
e,科学计数
a,16进制计数
g,G 与e/f一样
()|,元素格式(开头/结尾/分隔)
%%表单个’%'符
标志(可连用):
- 左对齐
+打印正负号
可选方式打印
0 0零填充
空格 空格填充
int value = 12;
writefln("Binary : %b", value);
writefln("Octal : %o", value);
writefln("Hexadecimal: %x", value);
writefln("Decimal : %d", value);
e:按以下规则打印浮点参数:
小数点前的数,
精度非0,则小数点
小数点后的数,由精度决定,默认精度为6
e字符,表10的幂
-或+,由指数是否大于0决定.
指数至少包含两个数.
//及
double value = 123.456789;
writefln("with e: %e", value);
writefln("with f: %f", value);
writefln("with g: %g", value);
writefln("with a: %a", value);
E:与e相同,只是输出’E’
f/F:小数点前至少一个数字,默认精度是小数点后6位数
g:如果指数在-5与精度
之间,与f一样.其余与e一样.精度不指定小数点后位数
,而是整个值的有效位数
,如小数点后无有效位数
,则不打印小数点
.不打印小数点后最右边的0.
G与g一样,只是输出'E'与'F'
.
a:浮点参数按16进制格式打印:
前有0x
单个十六进制数
精度非0,则小数点
小数点后要求数,由精度决定,未指定精度,则尽量准确,
p,表2的幂
‘-’/’+’,由指数是否>0决定.
指数,至少包含1个数.0的指数为0.
A与a一样,但输出0X与P.
//及
bool b = true;
int i = 365;
double d = 9.87;
string s = "formatted";
auto o = File("test_file", "r");
int[] a = [ 2, 4, 6, 8 ];
writefln("bool : %s", b);
writefln("int : %s", i);
writefln("double: %s", d);
writefln("string: %s", s);
writefln("object: %s", o);
writefln("array : %s", a);
s的规则:
布尔,为真
/假
.
整:%d
浮:%g
utf8编码,
精度决定字节最大数,
构/类,按toString
返回值打印
数组按元素值,挨个打印
宽度
,如果宽度是负值,则假定为-
标志.如为*
,则按下个参数的值的宽度打印
int value = 100;
writefln("10符字段:%10s", value);
writefln("5 符字段:%5s", value);
精度,小数点后的数,如为星号,则从下个参数读(必须为整),忽略负精度
double value = 1234.56789;
writefln("%.8g", value);
writefln("%.3g", value);
writefln("%.8f", value);
writefln("%.3f", value);
//
auto number = 0.123456789;
writefln("Number: %.*g", 4, number);
//从下个参数来读.即4为精度.
int value = 123;
writefln("一般右对齐:|%10d|", value);
writefln("左对齐:|%-10d|", value);
writefln("负值:%+d", -50);
writefln("正值有+号: %+d", 50);
writefln("正值无+号: %d", 50);
#
号,按其他进制打印格式
o,8进制,前为0
x,16进制,前为0x
X,16进制,前为0X
浮点,都要打印小数点
g,G,小数点后0都要打印
writefln("八进制0开头: %#o", 1000);
writefln("16进制0x开头: %#x", 1000);
writefln("10进制有小数点: %#g", 1f);
writefln("打印右边零:%#g", 1.2);
0:字段按0填充.
writefln("8符: %08d", 42);
空格符,空格填充
writefln("负值无效: % d", -34);
writefln("正值有空格:% d", 56);
writefln("正值无空格:%d", 56);
再加一个位置参数
% position$ flags width precision format_character
%数字$
表示第几个参数.
writefln("%1$d %1$x %1$o %1$b", 42);
auto format = (language == "en"
? "There are %1$s students in room %2$s."
: "在%2$s房间有%1$s个学生.");
writefln(format, count, room);
//交换顺序有时很有用的
格式化元素输出(相当于批量输出,对容器有效):
auto numbers = [ 1, 2, 3, 4 ];
writefln("%(%s%)", numbers);
%(
:开始.%)
结束.
writefln("%({%s},%)", numbers);
},
被视为分隔符,只在元素间打印,而不是所有在打印元素上.
writefln("%({%s}%|,%)", numbers);
%|
表示这不是分隔符,都要打印.,
就是分隔符,
d
语言特点,就是遇见问题,就+
东西,’+'语法.
auto vegetables = [ "spinach", "asparagus", "artichoke" ];
writefln("%(%s, %)", vegetables);
writefln("%-(%s, %)", vegetables);
串又不一样
.%-
不会出现串.
writefln("%(%s%)", "hello");
writefln("%-(%s%)", "hello");
%-
表无分隔符.
天书来了:
auto spelled = [ 1 : "one", 10 : "ten", 100 : "hundred" ];
writefln("%-(%s (%s)%|, %)", spelled);
格式到串.
import std.stdio;
import std.string;//这个模块里面的format
void main() {
write("What is your name? ");
auto name = strip(readln());
auto result = format("Hello %s!", name);
}
还可以检查格式串
的问题
import std.stdio;
void main(){
writefln!"%s%s"(1); // 编译错误(额外%s)
writefln!"%s"(1,2);// 编译错误(额外2)
writefln!"%s%d"(1,2.5); //编译错误(不匹配的%d和2.5)
}
writef, writefln, formattedWrite, readf, formattedRead
这些函数都可以带格式串
作为参数,因而可以编译时检查格式串是否有问题.!
为模板实例符.
import std.stdio;
void main() {
write("First name: ");
string firstName;
readf(" %s\n", &firstName);//\n at the end
write("Last name : ");
string lastName;
readf(" %s\n", &lastName);//\n at the end
write("Age : ");
int age;
readf(" %s", &age);
writefln("%s %s (%s)", firstName, lastName, age);
}
格式化输入.
整数:d:10进制,o:8进制,x:16进制
浮:f,s:根据变量类型读.c读单个符
int number_d;
int number_o;
int number_x;
readf(" %d %o %x", &number_d, &number_o, &number_x);
writeln("Read with %d: ", number_d);
writeln("Read with %o: ", number_o);
writeln("Read with %x: ", number_x);
都输入23
,但他们的值不一样.