09用d编程格式化输出

% 标志 宽 精度 格式符号
writefln("项 %d:%9.02f", i + 1, items[i]);
d的格式与C类似.

格式符:b,x/X,o,d,还有e,f,g,a
格式 限定
s,默认
b,二进制
d,十进制
o,八进制
x/X,16进制
f/F,标准10进制格式浮点计数
e,科学计数
a,16进制计数
g,G,与e/f一样
()|,元素格式(开头/结尾/分隔)
%%表单个’%'符
标志(可连用):
1,-左对齐
2,+打印正负号
3,#可选方式打印
4,00零填充
5,空格空格填充

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("你名字是? ");
    auto name = strip(readln());

    auto result = format("你好%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("姓: ");
    string firstName;
    readf(" %s\n", &firstName);//\n 在尾
    write("名: ");
    string lastName;
    readf(" %s\n", &lastName);//\n在尾 

    write("年龄       : ");
    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("用%d读: ", number_d);
    writeln("用%o读: ", number_o);
    writeln("用%x读: ", number_x);

都输入23,但他们的值不一样.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值