string.Format出现异常"输入的字符串格式有误"的解决方法

string.Format出现异常"输入的字符串格式有误"的解决方法

今天在做项目时,碰到一个很奇怪的问题,我使用string.Format居然报“输入的字符串格式有误”的错误,我调了很久,还是不对,不明白错 在哪里,后来还是google了一下,原来我在字符串中出现了"{"字符。而"{"字符若出现在string.Format中是必需转义的,也就是要用两 个"{{"代表一个"{",同时双下面把我查找到的解决方法的相关文章一同粘贴出来。

一、转义

C# 中使用类似 {0}, {1:yyyy-MM-dd} 这样的格式占位符,如果被格式化字符串本身包含 { 或者 } 怎么办呢?答案是:用两个 { 或者 }连写表示单个。

例如
string str1 = String.Format("{{Hello}}, {0}, Now is {{{1:yyyy-MM-dd HH:mm:ss}}}",
    "Jinglecat",
    DateTime.Now); // {Hello}, Jinglecat, Now is {2007-07-18 23:06:35}
string str2 = String.Format("{Hello}, {0}, Now is {{1:yyyy-MM-dd HH:mm:ss}}",
    "Jinglecat",
    DateTime.Now); // --> System.FormatException: 输入字符串的格式不正确。

事实上,很多情况下带特殊含义的字符都是这样转义的:如,
C#  中,当字符串常量带 @  前导的时候,用两个 " 连写表示一个 " (半角双引号)
string str3 = @"My UserName is ""Jinglecat""."; // My UserName is "Jinglecat".
//string str4 = @"My UserName‘s "Jinglecat""; // error CS1002: 应输入 ;
//string str5 = @"My UserName‘s \"Jinglecat\""; // error CS1002: 应输入 ;

SQL 字符串常量,用两个 ‘ 连写表示一个 ‘ (半角单引号)
DECLARE @str6 varchar(100)
SET @str6 = ‘My UserName is ‘‘Jinglecat‘‘.‘
PRINT @str6 -- My UserName is ‘Jinglecat‘.

正则表达式中用,两个 $ 连写表示一个 $  (dollar)

二、String Formatting in C#

基本内容是:可以在 Console.WriteLine(以及 String.Format,它被 Console.WriteLine 调用)中的格式字符串内的括号中放入非索引数字的内容。格式规范的完整形式如下:

{index [, width][:formatstring]}

其中,index 是此格式程序引用的格式字符串之后的参数,从零开始计数;width(如果有的话)是要设置格式的字段的宽度(以空格计)。width 取正数表示结果右对齐,取负数则意味着数字在字段中左对齐。(请参阅下面的前两个示例。)

formatstring 是可选项,其中包含有关设置类型格式的格式说明。如果对象实现 IFormattableformatstring 就会传递给对象的 Format 方法(在 Beta 2 和后续版本中,该方法的签名变为 ToString(string, IFormatProvider),但功能不变)。如果对象不实现 IFormattable,就会调用 Object.ToString(),而忽略 formatstring

另请注意,在 Beta 1 中不区分当前语言的 ToString 在 Beta 2 和后续版本中“将”区分语言。例如,对于用“.”分隔千位,用“,”分隔小数的国家,1,234.56 将会格式化成 1.234,56。如果您需要结果无论在什么语言下都是一样的,就请使用 CultureInfo.InvariantCulture 作为语言。

若要获取有关格式的完整信息,请查阅“.NET 框架开发人员指南”中的格式概述(英文)

例如:String.Format("[{0,-10:0##.#0}]", 14)="[014.00    ]";-10表示左对齐,总共占10位,不够了补空字符。

Strings

There really isn’t any formatting within a strong, beyond it’s
alignment. Alignment works for any argument being printed in a
String.Format call.

Sample Generates
String.Format(”->{1,10}<-”, “Hello”); -> Hello<-
String.Format(”->{1,-10}<-”, “Hello”); ->Hello <-

Numbers

Basic number formatting specifiers:

Specifier Type Format Output (Passed Double 1.42) Output (Passed Int -12400)
c Currency {0:c} $1.42 -$12,400
d Decimal (Whole number) {0:d} System.FormatException -12400
e Scientific {0:e} 1.420000e+000 -1.240000e+004
f Fixed point {0:f} 1.42 -12400.00
g General {0:g} 1.42 -12400
n Number with commas for thousands {0:n} 1.42 -12,400
r Round trippable {0:r} 1.42 System.FormatException
x Hexadecimal {0:x4} System.FormatException cf90

注:{0:n2}表示千位用,隔开小说点后面两位

Custom number formatting:

Specifier Type Example Output (Passed Double 1500.42) Note
0 Zero placeholder {0:00.0000} 1500.4200 Pads with zeroes.
# Digit placeholder {0:(#).##} (1500).42  
. Decimal point {0:0.0} 1500.4  
, Thousand separator {0:0,0} 1,500 Must be between two zeroes.
,. Number scaling {0:0,.} 2 Comma adjacent to Period scales by 1000.
% Percent {0:0%} 150042% Multiplies by 100, adds % sign.
e Exponent placeholder {0:00e+0} 15e+2 Many exponent formats available.
; Group separator see below    

The group separator is especially useful for formatting currency
values which require that negative values be enclosed in parentheses.
This currency formatting example at the bottom of this document makes it
obvious:

注:

如果相应的数字是前导零或尾随零,“#”字符就会替换为空值。无论相应数字的值如何,“0”字符都会被替换为零字符 — 因此,数字将会被零填补。句号(如果有的话)表示小数分隔符的位置。

那么,为什么要同时使用这些字母,比如“###0.##”? 如果要设置格式的值恰好为零,“#”
图片字符就被替换为“无”(连零字符也不是)。您可能“总是”希望在小数点的左边至少有一个“0”,否则,如果值为零,字段就没有输出。换言之,仅包含
“#”字符,一个“0”也没有的格式常被认为是一个编程错误。

例如

string.Format("{0:###.##},14")="14";

string.Format("{0:0##.#0},14")="014.00"

Dates

Note that date formatting is especially dependant on the system’s
regional settings; the example strings here are from my local locale.

Specifier Type Example (Passed System.DateTime.Now)
d Short date 10/12/2002
D Long date December 10, 2002
t Short time 10:11 PM
T Long time 10:11:29 PM
f Full date & time December 10, 2002 10:11 PM
F Full date & time (long) December 10, 2002 10:11:29 PM
g Default date & time 10/12/2002 10:11 PM
G Default date & time (long) 10/12/2002 10:11:29 PM
M Month day pattern December 10
r RFC1123 date string Tue, 10 Dec 2002 22:11:29 GMT
s Sortable date string 2002-12-10T22:11:29
u Universal sortable, local time 2002-12-10 22:13:50Z
U Universal sortable, GMT December 11, 2002 3:13:50 AM
Y Year month pattern December, 2002

The ‘U’ specifier seems broken; that string certainly isn’t sortable.

Custom date formatting:

Specifier Type Example Example Output
dd Day {0:dd} 10
ddd Day name {0:ddd} Tue
dddd Full day name {0:dddd} Tuesday
f, ff, … Second fractions {0:fff} 932
gg, … Era {0:gg} A.D.
hh 2 digit hour {0:hh} 10
HH 2 digit hour, 24hr format {0:HH} 22
mm Minute 00-59 {0:mm} 38
MM Month 01-12 {0:MM} 12
MMM Month abbreviation {0:MMM} Dec
MMMM Full month name {0:MMMM} December
ss Seconds 00-59 {0:ss} 46
tt AM or PM {0:tt} PM
yy Year, 2 digits {0:yy} 02
yyyy Year {0:yyyy} 2002
zz Timezone offset, 2 digits {0:zz} -05
zzz Full timezone offset {0:zzz} -05:00
: Separator {0:hh:mm:ss} 10:43:20
/ Separator {0:dd/MM/yyyy} 10/12/2002

Enumerations

Specifier Type
g Default (Flag names if available, otherwise decimal)
f Flags always
d Integer always
x Eight digit hex.

Some Useful Examples

String.Format(”{0:$#,##0.00;($#,##0.00);Zero}”, value);

This will output “$1,240.00″ if passed 1243.50. It will output the
same format but in parentheses if the number is negative, and will
output the string “Zero” if the number is zero.

String.Format(”{0:(###) ###-####}”, 8005551212);

This will output “(800) 555-1212″.

转自:http://blog.zxbc.cn/html/59/959-2512.html

时间: 2024-12-25 02:49:30

string.Format出现异常"输入的字符串格式有误"的解决方法的相关文章

ERROR 1366 (HY000): Incorrect string value: &#39;\xAD\xE5\x9B\xBD\xE9\x82...&#39; fo的解决方法

本地wamp导入4G数据时,出现了ERROR 1366 (HY000): Incorrect string value: '\xAD\xE5\x9B\xBD\xE9\x82...,如图下 找到的解决的方法如下: my.ini,打开 1.在[client]段落增加:default-character-set=utf8 2.在[mysqld]段落增加:character_set_server=utf8 重启MySQL服务即可. 如果还是不能解决问题,重新打开 Mysql 控制台操作如下: 1. 打开

【转】chrome 67版本后无法拖拽离线安装CRX格式插件的解决方法

第一种:开启开发者模式即可 (推荐) chrome  的设置 -> 更多工具 -> 扩展程序,开启开发者模式即可! 第二种方法:修改参数 首先打开下面地址:chrome://flags/#extensions-on-chrome-urls 将 disabled 改为 enable 重启即可 第三种:修改文件格式,加载扩展程序 有时候要在 chrome安装本地插件时,会报错,这时候将插件的后缀名 .crx 改为  .zip或者 .rar,然后将改好后缀名的文件解压到本地文件夹中,然后在 chro

POI 导出excel带小数点的数字格式显示不对解决方法

最近看到了一个问题就是java导出excel中带小数点的数字显示不对, 比如我想在excel中第一行显示:  3,000.0 但是在excle中导出的格式总是不带小数点 3000(非文本格式),而且也不是以金融格式显示的.这时候我们的解决方法是要为单元格中的数字设置dataformat.代码如下 import java.io.FileOutputStream; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.h

Android Studio中Button等控件的Text中字符串默认大写的解决方法

初学Android的时候,在Android Studio中xml里面添加一个Button.EditText等控件后,它的Text总是会显示大写,即使你输入的字符串是小写也不行,控制字符串大小写的属性是android:textAllCaps, 最后查看了一下Themes.xml文件,找到了一些端倪,发现在设置样式的时候,默认是把所有的字符串显示大写true. 如图,是从android的Style.xml中的截图,   [解决办法] 1. 把xml中你不想大写的控件添加一行 android:text

ConnectionString连接字符串-密码丢失的解决方法

今天遇到一个问题,EF,asp.net  web端登录成功,退出,再登录就异常了, 登出成功时, EF 中 dbcontext.Database.Connection.ConnectionString=data source=.;initial catalog=ZhpGame;user id=sa;password=456;MultipleActiveResultSets=True;App=EntityFramework 再次登录时,遇到鬼了dbcontext.Database.Connecti

Ubuntu输入su提示认证失败的解决方法

启动Apache服务时竟然提示权限不够,用su切换,输入密码提示认证失败,这下搞了吧,后来一经查阅原来Ubuntu安装后,root用户默认是被锁定了的,不允许登录,也不允许 su 到 root ,对于桌面用户来说这个可能是为了增强安全性,但是服务器版上的没这个还真不行,赶紧设置下吧. 终端下 [email protected]:~$ sudo passwd Password: <--- 输入安装时那个用户的密码 Enter new UNIX password: <--- 新的Root用户密码

CentOS上无法识别NTFS格式分区的解决方法

插入U盘之后,按照下面的步骤: # fdisk -l /dev/sd* 通常这一步就能找到U盘,如果U盘有指示灯也会亮,表示被找到. # mount –t ntfs /dev/sdb1 /mnt/    mount: unknown filesystem type ‘ntfs’ 这是由于CentOS release 5.5(Final)上无法识别NTFS格式的分区. 解决办法:        通过使用 ntfs-3g 来解决.        打开ntfs-3g的下载点http://www.tux

Ubuntu 16 vi输入方向键会变成ABCD的解决方法

1. 开启root用户 首先给root用户设置一个密码: $ sudo passwd root 1 1 2. 使用root用户登陆 $ sudo vi /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf 1 1 在最后增加greeter-show-manual-login=true 保存退出.注销后可看到登陆框已显示,可输入用户名. 3. 关闭guest用户 $ sudo vi /usr/share/lightdm/lightdm.conf.d/50

vim黏贴代码格式混乱的解决方法

from:http://blog.csdn.net/commshare/article/details/6215088 感谢牛人的文章.解决了我在vim使用中,很头疼的问题. 在vim新建文件的时候,黏贴代码会自动缩进,导致格式非常混乱. 按照博主的经验,在/etc/vim中,修改vimrc,添加 set pastetoggle=<F9> 在黏贴代码之前,进入insert模式,按F9,就可以关闭自动缩进. 当需要自己手写代码的时候,进入insert模式,默认就是自动缩进了. ===== vim