字符串操作在任意编程语言的日常编程中都随处可见,今天来汇总一下 C# 中关于字符串的一些你可能遗忘或遗漏的知识点。

逐字字符串

在普通字符串中,反斜杠字符是转义字符。而在逐字字符串(Verbatim Strings)中,字符将被编程器按照原义进行解释。使用逐字字符串只需在字符串前面加上 @ 符号。

// 逐字字符串:转义符
var filename = @"c:\temp\newfile.txt";
Console.WriteLine(filenaame); // 逐字字符串:多行文本
var multiLine = @"This is a
multiline paragraph.";
Console.WriteLine(multiLine); // 非逐字字符串
var escapedFilename = "c:\temp\newfile.txt";
Console.WriteLine(escapedFilename);

输出:

c:\temp\newfile.txt
This is a
multiline paragraph.
c: emp
ewfile.txt

逐字字符串中唯一不被原样解释的字符是双引号。由于双引号是定义字符串的关键字符,所以在逐字字符串中要表达双引号需要用双引号进行转义。

varstr = @"""I don't think so"", he said.";
Console.WriteLine(str);
// 输出:"I don't think so", he said.

在逐字字符串中也可以 $ 符号实现字符串内插值。

Console.WriteLine($@"Testing \n 1 2 {5 - 2}");
// 输出:Testing \n 1 2 3

数字格式化转换

典型的的格式化方法为:

string.Format("{index[:format]}", number)

可使用“0”和“#”占位符进行补位。“0” 表示位数不够位数就补充“0”,小数部分如果位数多了则会四舍五入;“#”表示占位,用于辅助“0”进行补位。

标准格式化用法:

// “0”描述:占位符,如果可能,填充位
string.Format("{0:000000}",1234); // 结果:001234 // “#”描述:占位符,如果可能,填充位
string.Format("{0:######}",1234); // 结果:1234
string.Format("{0:#0####}",1234); // 结果:01234
string.Format("{0:0#0####}",1234); // 结果:0001234 // "."描述:小数点
string.Format("{0:000.000}", 1234); // 结果:1234.000
string.Format("{0:000.000}", 4321.12543); // 结果:4321.125 // ","描述:千分表示
string.Format("{0:0,0}", 1234567); //结果:1,234,567 // "%"描述:格式化为百分数
string.Format("{0:0%}",1234); // 结果:123400%
string.Format("{0:#%}", 1234.125); // 结果:123413%
string.Format("{0:0.00%}",1234); // 结果:123400.00%
string.Format("{0:#.00%}",1234.125); // 结果:123412.50%

内置快捷字母格式化用法:

// E-科学计数法表示
(25000).ToString("E"); // 结果:2.500000E+004 // C-货币表示,带有逗号分隔符,默认小数点后保留两位,四舍五入
(2.5).ToString("C"); // 结果:¥2.50 // D[length]-十进制数
(25).ToString("D5"); // 结果:00025 // F[precision]-浮点数,保留小数位数(四舍五入)
(25).ToString("F2"); // 结果:25.00 // G[digits]-常规,保留指定位数的有效数字,四舍五入
(2.52).ToString("G2"); // 结果:2.5 // N-带有逗号分隔符,默认小数点后保留两位,四舍五入
(2500000).ToString("N"); // 结果:2,500,000.00 // X-十六进制,非整型将产生格式异常
(255).ToString("X"); // 结果:FF

ToString 也可以自定义补零格式化:

(15).ToString("000");              // 结果:015
(15).ToString("value is 0"); // 结果:value is 15
(10.456).ToString("0.00"); // 结果:10.46
(10.456).ToString("00"); // 结果:10
(10.456).ToString("value is 0.0"); // 结果:value is 10.5

转换为二进制、八进制、十六进制输出:

int number = 15;
Convert.ToString(number, 2); // 结果:1111
Convert.ToString(number, 8); // 结果:17
Convert.ToString(number, 16); // 结果:f

自定义格式化器:

public class CustomFormat : IFormatProvider, ICustomFormatter
{
public string Format(string format, object arg, IFormatProvider formatProvider)
{
if (!this.Equals(formatProvider))
{
return null;
}
if (format == "Reverse")
{
return string.Join("", arg.ToString().Reverse());
}
return arg.ToString();
} public object GetFormat(Type formatType)
{
return formatType == typeof(ICustomFormatter) ? this : null;
}
}

使用自定义格式化器:

String.Format(newCustomFormat(), "-> {0:Reverse} <-", "Hello World");
// 输出:-> dlroW olleH <-

字符串拼接

将数组中的字符串拼接成一个字符串:

var parts = new[] { "Foo", "Bar", "Fizz", "Buzz"};
var joined = string.Join(", ", parts);
// joined = "Foo, Bar, Fizz, Buzz"

以下四种方式都可以达到相同的字符串拼接的目的:

string first = "Hello";
string second = "World";
string foo = first + " " + second;
string foo = string.Concat(first, " ", second);
string foo = string.Format("{0} {1}", firstname, lastname);
string foo = $"{firstname} {lastname}";

字符串内插法

简单用法:

var name = "World";
var str =$"Hello, {name}!";
// str = "Hello, World!"

带日期格式化:

var date = DateTime.Now();
var str = $"Today is {date:yyyy-MM-dd}!";

补齐格式化(Padding):

var number = 42;

// 向左补齐
var str = $"The answer to life, the universe and everything is {number, 5}.";
// str = "The answer to life, the universe and everything is ___42." ('_'表示空格) // 向右补齐
var str = $"The answer to life, the universe and everything is ${number, -5}.";
// str = "The answer to life, the universe and everything is 42___."

结合内置快捷字母格式化:

var amount = 2.5;
var str = $"It costs {amount:C}";
// str = "¥2.50" var number = 42;
var str = $"The answer to life, the universe and everything is {number, 5:f1}.";
// str = "The answer to life, the universe and everything is ___42.1"

参考:

1.《C# 7.0 in a Nutshell》

2. https://bit.ly/2U1eIK9

[C#.NET拾遗补漏]01:字符串操作的更多相关文章

  1. [C#.NET 拾遗补漏]05:操作符的几个骚操作

    阅读本文大概需要 1.5 分钟. 大家好,这是极客精神[C#.NET 拾遗补漏]专辑的第 5 篇文章,今天要讲的内容是操作符. 操作符的英文是 Operator,在数值计算中习惯性的被叫作运算符,所以 ...

  2. [C#.NET 拾遗补漏]08:强大的LINQ

    大家好,这是 [C#.NET 拾遗补漏] 系列的第 08 篇文章,今天讲 C# 强大的 LINQ 查询.LINQ 是我最喜欢的 C# 语言特性之一. LINQ 是 Language INtegrate ...

  3. matlab字符串操作总结

    matlab字符串操作总结 字符串操作总结 char(S1,S2,…)利用给定的字符串或单元数组创建字符数组double(S)将字符串转化成ASC码形式cellstr(S)利用的给定的字符数组创建字符 ...

  4. day8(字符串操作)

    一.字符串操作 1.index  #返回字符串的索引值 s = "Hello word" print(s.index('o')) 2.isalnum #检测字符串是否由字母和数字组 ...

  5. SQL字符串操作汇总

    SQL字符串操作汇总 --将字符串中从某个字符开始截取一段字符,然后将另外一个字符串插入此处 select stuff('hello,world!',4,4,'****')   --返回值hel*** ...

  6. mysql常用字符串操作函数大全,以及实例

    今天在论坛中看到一个关于mysql的问题,问题如下 good_id     cat_id12654         665,56912655         601,4722 goods_id是商品i ...

  7. 第三章 JQuery: HelloWorld--常见方法--css--选择器--筛选器--属性--效果--事件--数组操作--字符串操作--对象转换

    1.jQuery简介 为了简化JavaScript 的开发, 一些JavsScript 库诞生了. JavaScript库封装了很多预定义的对象和实用函数.能帮助使用者建立有高难度交互的页面, 并且兼 ...

  8. VC++ 字符串操作学习总结

    vc++中各种字符串(转载) http://www.cnblogs.com/tomin/archive/2008/12/28/1364097.html CString ,BSTR ,LPCTSTR之间 ...

  9. [C#.NET 拾遗补漏]07:迭代器和列举器

    大家好,这是 [C#.NET 拾遗补漏] 系列的第 07 篇文章. 在 C# 中,大多数方法都是通过 return 语句立即把程序的控制权交回给调用者,同时也会把方法内的本地资源释放掉.而包含 yie ...

随机推荐

  1. 在web项目中使用shiro(记住我功能)

    第一步,添加“记住我”复选框,rememberMe要设置参数 第二步,配置shiro的主配置文件 注意 rememberMeCookie对应的bean中要声明 <constructor-arg ...

  2. linux centos7搭建mysql-5.7.29

    1. 下载mysql 1.1  下载地址 https://downloads.mysql.com/archives/community/ 1.2  版本选择 2. 管理组及目录权限 2.1  解压my ...

  3. abp web.mvc项目中的菜单加载机制

    abp中的菜单加载机制 在abp中菜单的定义与我们传统写的框架不一样,它是在编写代码的时候配置,而我们一般写的通用权限管理系统中,是后期在后台界面中添加的.这一点有很大不同.abp关于菜单的定义及管理 ...

  4. C# 委托delegate的基本用法

    委托:就是一个方法的类型,下面3个调用情况来详细熟悉一下: 1.调用组合委托 //委托:就是一个方法的类型 public delegate int TestDelegateStr(); public ...

  5. Universalimageloader 原图片大小获取

    Universalimageloader1.9.5上还没有对外提供获取图片的原大小功能,如果需要获取图片的源大小,可参考stackoverflow上的解决办法 stackoverflow地址 主要实现 ...

  6. 2018-06-25 js表单事件、三个高度和Ajax异步通讯技术

    表单事件: onfocus -> 表单控件得到焦点时触发: obj_ipt.onfocus=function(){}; onblur -> 表单控件失去焦点时: onchange -> ...

  7. Lr运行错误Error: Socket descriptor not found. Hint: the problem might be

    在controller中,运行时,报如下错误“Error: Socket descriptor not found.  Hint: the problem might be solved applyi ...

  8. 基于Vue搭建自己的组件库(1)

    本项目演示地址:https://husilang.github.io/zm-ui 项目参考文章:从零开始搭建Vue组件库 VV-UI 项目的初衷是学习怎么封装一个基于Vue的UI组件库,顺便记录每个步 ...

  9. Centos 7 下自启动服务配置

    在服务器部署服务后,往往需要将服务设置成开机自启的状态 ,以防设备出现宕机或断电重启,服务无法访问的情况. 对于常见的服务(httpd,mysqld,nginx)来说,可通过系统 systemctl ...

  10. mysql小白系列_11 MHA

    一.MHA是什么?能干什么的 (1)以Perl语言写的一套Mysql故障切换方案,一个脚本管理工具 (2)保障数据库的高可用性 (3)修复多个slave之间的差异日志,最终使所有的slave保持数据一 ...