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

摘要:
string.Format出现异常"输入的字符串格式有误"的解决方法今天在做项目时,碰到一个很奇怪的问题,我使用string.Format居然报“输入的字符串格式有误”的错误,我调了很久,还是不对,不明白错在哪里,后来还是google了一下,原来我在字符串中出现了"{"字符。而"{"字符若出现在string.Format中是必需转义的,也就是要用两个"{{"代表一个"{",同时双下面把我查找到的解决方法的相关文章一同粘贴出来。例如:String.Format="[014.00]";-10表示左对齐,总共占10位,不够了补空字符。
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@str6varchar(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.

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

Numbers

Basic number formatting specifiers:

SpecifierTypeFormat Output (Passed Double 1.42)Output (Passed Int -12400)
cCurrency{0:c}$1.42-$12,400
dDecimal (Whole number){0:d}System.FormatException-12400
eScientific{0:e}1.420000e+000-1.240000e+004
fFixed point{0:f}1.42-12400.00
gGeneral{0:g}1.42-12400
nNumber with commas for thousands{0:n}1.42-12,400
rRound trippable{0:r}1.42System.FormatException
xHexadecimal{0:x4}System.FormatExceptioncf90

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

Custom number formatting:

SpecifierTypeExample Output (Passed Double 1500.42)Note
0Zero placeholder{0:00.0000}1500.4200Pads with zeroes.
#Digit placeholder{0:(#).##}(1500).42
.Decimal point{0:0.0}1500.4
,Thousand separator{0:0,0}1,500Must be between two zeroes.
,.Number scaling{0:0,.}2Comma adjacent to Period scales by 1000.
%Percent{0:0%}150042%Multiplies by 100, adds % sign.
eExponent placeholder{0:00e+0}15e+2Many exponent formats available.
;Group separatorsee 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.

SpecifierTypeExample (Passed System.DateTime.Now)
dShort date10/12/2002
DLong dateDecember 10, 2002
tShort time10:11 PM
TLong time10:11:29 PM
fFull date & time December 10, 2002 10:11 PM
FFull date & time (long)December 10, 2002 10:11:29 PM
gDefault date & time10/12/2002 10:11 PM
GDefault date & time (long)10/12/2002 10:11:29 PM
MMonth day patternDecember 10
rRFC1123 date stringTue, 10 Dec 2002 22:11:29 GMT
sSortable date string2002-12-10T22:11:29
uUniversal sortable, local time2002-12-10 22:13:50Z
UUniversal sortable, GMTDecember 11, 2002 3:13:50 AM
YYear month patternDecember, 2002

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

Custom date formatting:

SpecifierTypeExample Example Output
ddDay{0:dd}10
dddDay name{0:ddd}Tue
ddddFull day name{0:dddd}Tuesday
f, ff, …Second fractions{0:fff}932
gg, …Era{0:gg}A.D.
hh2 digit hour{0:hh}10
HH2 digit hour, 24hr format{0:HH}22
mmMinute 00-59{0:mm}38
MMMonth 01-12{0:MM}12
MMMMonth abbreviation{0:MMM}Dec
MMMMFull month name{0:MMMM}December
ssSeconds 00-59{0:ss}46
ttAM or PM{0:tt}PM
yyYear, 2 digits{0:yy}02
yyyyYear{0:yyyy}2002
zzTimezone offset, 2 digits{0:zz}-05
zzzFull timezone offset{0:zzz}-05:00
:Separator{0:hh:mm:ss}10:43:20
/Separator{0:dd/MM/yyyy}10/12/2002

Enumerations

SpecifierType
gDefault (Flag names if available, otherwise decimal)
fFlags always
dInteger always
xEight 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″.

免责声明:文章转载自《string.Format出现异常"输入的字符串格式有误"的解决方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇清华的人工智能究竟在哪个学院?.net 分布式架构之分布式锁实现下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

dateutil

Date、long、Calendar之间的相互转换 //当前时间 Date date = DateUtil.date(); //当前时间 Date date2 = DateUtil.date(Calendar.getInstance()); //当前时间 Date date3 = DateUtil.date(System.currentTimeMillis...

操作百度API

1 string json = ""; 2 try 3 { //虽然两者都是异步请求事件,但是WebClient是基于事件的异步,而HttpWebRequst是基于代理的异步编程 4 WebClient client = ne...

Spring Boot -- Spring Boot之@Async异步调用、Mybatis、事务管理等

这一节将在上一节的基础上,继续深入学习Spring Boot相关知识,其中主要包括@Async异步调用,@Value自定义参数、Mybatis、事务管理等。 本节所使用的代码是在上一节项目代码中,继续追加的,因此需要先学习上一节内容。 一、使用@Async实现异步调用 要在springboot中使用异步调用方法,只要在被调用的方法上面加上@Async就可以...

C#如何获取其他程序ListView控件中的内容

源码下载:http://download.csdn.net/detail/php_fly/4923388 需求:获取其他程序中的ListView控件的文本内容 原理:进程之间是相互隔离的,数据是不能共享的(有些特例)    LVM_GETTITEMTEXT:将一个数据缓冲区提供给listview32控件,你不能把你的进程的数据缓冲提供给另外的程序,所以要用...

java 注解 Annontation

什么是注解?   对于很多初次接触的开发者来说应该都有这个疑问?Annontation是Java5开始引入的新特征,中文名称叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。为程序的元素(类、方法、成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且供指定...

JAVA发送HTTP请求方式

1. HttpURLConnection 使用JDK原生提供的net,无需其他jar包; HttpURLConnection是URLConnection的子类,提供更多的方法,使用更方便。 package httpURLConnection; import java.io.BufferedReader; import java.io.InputStrea...