基础类库的东西看起来容易做起来难,今天花时间实现了一点点 .Net 风格的字符串格式化函数,贴出来娱乐一下。
注意:目前仅支持占位符索引号而已...
- import std.stdio;
- import std.string;
- import std.conv;
-
- alias void delegate(char c) Sink;
- alias void* Argument;
-
- const size_t MaxArguments = 16;
-
- void format(char[] fmt, Sink sink, Argument argPtr, TypeInfo[] argtis)
- {
- assert(argtis.length <= MaxArguments, "format: Too many arguments");
- Argument[MaxArguments] args = void;
-
- foreach (size_t i, ti; argtis)
- {
- args[i] = argPtr;
-
-
- argPtr += (ti.tsize + int.sizeof - 1) & ~ (int.sizeof - 1);
- }
-
- doFormat(fmt, sink, args, argtis);
- }
-
- void format(char[] fmt, Sink sink, ...)
- {
- format(fmt, sink, _argptr, _arguments);
- }
-
- size_t skipSpaces(char[] str)
- {
- size_t i;
- for(i = 0; i < str.length; i++)
- {
- if(str[i] != ' ')return i;
- }
- return i;
- }
-
- uint extractNumber(char[] str)
- {
- size_t len = 0;
- foreach(char c; str)
- {
- if(c >= '0' && c <= '9') len++;
- else break;
- }
- if(len == 0)
- throw new Exception("Format: syntax error");
- return toUint(str[0 .. len]);
- }
-
- size_t findRightBrach(char[] str)
- {
- foreach(size_t i, char c; str)
- {
- if(c == '}')
- return i;
- }
-
-
- throw new Exception("Format: Syntax error");
- }
-
- void doFormat(char[] fmt, Sink sink, Argument[] args, TypeInfo[] ti)
- {
- for(size_t i = 0; i < fmt.length;)
- {
-
- for(; i < fmt.length && fmt[i] != '{'; i++)
- sink(fmt[i]);
-
- if(i >= fmt.length)break;
-
-
- if(i < fmt.length - 1 && fmt[i + 1] == '{')
- {
- i += 2;
- sink('{');
- continue;
- }
-
- size_t beginBrach = i;
- size_t endBrach = i + findRightBrach(fmt[i .. $]);
-
-
- doParse(fmt[beginBrach + 1 .. endBrach], sink, args, ti);
-
- i = endBrach + 1;
- }
- }
-
- void doParse(char[] fmt, Sink sink, Argument[] args, TypeInfo[] ti)
- {
- size_t i = 0;
- i += skipSpaces(fmt);
-
- uint index = extractNumber(fmt);
-
-
- int *iptr = cast(int*)args[index];
- foreach(char c; std.string.toString(*iptr))
- sink(c);
- }
-
- void print(char[] fmt, ...)
- {
- void sink(char c)
- {
- writef(c);
- }
-
- format(fmt, &sink, _argptr, _arguments);
- }
-
- void main()
- {
- print("Hello {0} {2} brach{{}}brach {1} Dotmars\n", 111, 2222, 333);
- }
分享到:
相关推荐
主要讲解了System类、Object类、Arrays类、Cloneable接口、IO系统输入输出类及装饰类、IO系统文本读写工具类、IO系统二进制读写工具类、对象序列化工具类、File类及文件搜索工具类、java异常机制及自定义异常类、...
详细介绍postman发送{}、[] 格式数据,后端10多种接收参数方式包括字符串、list、map等格式、详细介绍postman发送请求Params、form-data、raw、x-www-form-urlencoded的区别)、模拟跨域、设置断言、Postman模拟高...
.NET 2.0中的字符串比较 小试ASP.NET 2.0的兼容性 为 asp.net 2.0 的菜单控件增加 target 属性 ASP.NET 2.0 的内部变化 常见的 ASP.NET 2.0 转换问题和解决方案 Asp.Net2.0无刷新客户端回调 体验.net 2.0 的优雅(1...
许多转换和格式化选项 将C#代理和lambdas转换为Java接口和lambdas 使用Java泛型转换C#ref参数 当代码中定义事件委托时转换C#事件,或者是System.Action或System.Func代理之一 将所有类型的数组从C#转换成Java ...
(1)模板导出图片不显示(实际上导出来了只是最小化显示了) (2)fe循环指令存在而合并单元格的时候格式错乱问题 (3)fe存在一对多关系的时候格式错乱问题 不想下载的可以参考博文 ,代码是一样的 ...
16.1.3.管理连接字符串 第十七章. 使用ADO.NET进行数据访问 17.1.简介 17.2.动机 17.3.Provider抽象 17.3.1.创建IDbProvider类型的实例 17.4.命名空间 17.5.数据访问的方式 17.6.AdoTemplate简介 17.6.1.执行回调 ...
java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类...
设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节 通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到...
设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节 通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到...
字符串操作工具类(ToolString.java),生成UUID、非空非NULL逻辑判断、生成MD5等常用共通方法 数据操作工具类(ToolData.java),自动递归获取表单数据封装成Map、本地数据分页共通方法等 图片操作工具类...
设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节 通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到...
SayHello类持有一个对EnHelloGenerator的引用,并负责将生成出来的问候字符串打印出来。 using System; namespace IocInCSharp { public class SayHello { private EnHelloGenerator _helloGen; public ...
java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类。...
设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节 通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到...
设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节 通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到...
设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节 通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到...
java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类。...
java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类...
2.9.3 C++/CLI特有的功能——格式化输出 92 2.9.4 C++/CLI的键盘输入 94 2.9.5 使用safe_cast 95 2.9.6 C++/CLI枚举 96 2.10 小结 98 2.11 练习题 100 第3章 判断和循环 101 3.1 比较数据值 101 ...