可能重复:
在String.Format中转义大括号'{'
c#有一个String.Format方法,允许您格式化字符串,但是使用标记插入params {0} {1}
我试图创建一个简单的json字符串,需要大括号在字符串中,因此它打破了格式化程序
String.Format("{ foo:'{0}', bar:'{1}' }", foo, bar);
Run Code Online (Sandbox Code Playgroud)
在括号之前添加一个逃脱没有帮助
抛出一个异常,说我的字符串格式不正确,有人知道怎么解决这个问题吗?
给定ints 的字典,我正在尝试使用每个数字格式化字符串,以及项目的复数形式.
样本输入dict:
data = {'tree': 1, 'bush': 2, 'flower': 3, 'cactus': 0}
Run Code Online (Sandbox Code Playgroud)
样本输出str:
'My garden has 1 tree, 2 bushes, 3 flowers, and 0 cacti'
Run Code Online (Sandbox Code Playgroud)
它需要使用任意格式的字符串.
我提出的最佳解决方案是PluralItem存储两个属性的类n(原始值),s('s'如果是复数''则为字符串,否则为空字符串).对不同的复数方法进行了分类
class PluralItem(object):
def __init__(self, num):
self.n = num
self._get_s()
def _get_s(self):
self.s = '' if self.n == 1 else 's'
class PluralES(PluralItem):
def _get_s(self):
self.s = 's' if self.n == 1 else 'es'
class PluralI(PluralItem):
def …Run Code Online (Sandbox Code Playgroud) 我试图打印布尔表达式的真值表.在这样做时,我偶然发现了以下情况:
>>> format(True, "") # shows True in a string representation, same as str(True)
'True'
>>> format(True, "^") # centers True in the middle of the output string
'1'
Run Code Online (Sandbox Code Playgroud)
只要指定格式说明符,就format()转换True为1.我知道这bool是一个子类int,因此True评估为1:
>>> format(True, "d") # shows True in a decimal format
'1'
Run Code Online (Sandbox Code Playgroud)
但是,为什么不使用格式说明符的变化'True',以1在第一个例子?
我转向文档澄清.它唯一说的是:
一般惯例是,空格式字符串(
"")产生的结果与调用str()该值时的结果相同.非空格式字符串通常会修改结果.
因此,当您使用格式说明符时,字符串会被修改.但是,为什么从变化True到1,如果只对准运营商(例如^)被指定?
我刚刚在C#6.0中查看了新的字符串插值功能(有关详细信息,请参阅Roslyn的语言功能页面).使用当前语法(预计会改变),你可以做这样的事情(例子来自我刚才写的博客文章):
var dob2 = "Customer \{customer.IdNo} was born on \{customer.DateOfBirth:yyyyMdd}";
Run Code Online (Sandbox Code Playgroud)
但是,我似乎无法在格式化部分中包含短划线,例如:
var dob2 = "Customer \{customer.IdNo} was born on \{customer.DateOfBirth:yyyy-M-dd}";
Run Code Online (Sandbox Code Playgroud)
如果我这样做,我会收到错误:
错误CS1056意外字符' - 'StringInterpolation Program.cs 21
有什么方法可以让破折号在格式化部分工作吗?我知道我可以使用string.Format(),但我想看看它是否可以用字符串插值完成,就像练习一样.
使用format!,我可以创建一个String格式字符串,但如果我已经有一个String我想要附加的内容呢?我想避免分配第二个字符串只是为了复制它并丢弃分配.
let s = "hello ".to_string();
append!(s, "{}", 5); // Doesn't exist
Run Code Online (Sandbox Code Playgroud)
与C/C++相当的近似值snprintf.
什么是文化不变的构造字符串的方式,以便Javascript Date()构造函数可以解析它并创建正确的日期对象?
我试过这些格式字符串不起作用(使用C#生成字符串):
clientDate.ToString();
// gives: "11/05/2009 17:35:23 +00:00"
clientDate.ToString("MMM' 'dd', 'yyyy' 'h':'mm':'ss' 'tt");
// works on an English server
// but on a French server, gives: "mai 11, 2009 5:35:23"
// Javascript won't parse that.
clientDate.ToString("MM'-'dd'-'yyyy' 'HH':'mm':'ss")
// gives: 05-11-2009 17:35:23
Run Code Online (Sandbox Code Playgroud)
什么是通用格式?
这是我的绑定(缩短,Command-Property也绑定)
<MenuItem Header="Key" CommandParameter="{Binding StringFormat='Key: {0}', Path=PlacementTarget.Tag, RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>
Run Code Online (Sandbox Code Playgroud)
ContectMenu的PlacementTarget的Tag-Property是一个类似String的属性
"Short.Plural"
Run Code Online (Sandbox Code Playgroud)
我期望在Command-Handler中收到的是:
Key: Short.Plural
Run Code Online (Sandbox Code Playgroud)
但我真正得到的是:
Short.Plural
Run Code Online (Sandbox Code Playgroud) 我搜索了一下这方面的信息,但没有找到任何令人满意的.函数调用是否有一些特殊的行为
sprintf(someString, "");
Run Code Online (Sandbox Code Playgroud)
这解释了为什么这是警告(在gcc上使用-Wall)?我只是发现C标准允许零长度格式字符串.
我尝试了以下示例
#include <stdio.h>
int main()
{
char str[2] = {'a', 'a'};
sprintf(str, "");
printf("\'%c\'\'%c\'\n", str[0], str[1]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
打印出来的
'''a'
Run Code Online (Sandbox Code Playgroud)
这正是我期望看到的.那么,为什么警告?
我试图将unsigned short转换为大写的十六进制表示,并使用stringstream将前缀为0.我似乎无法得到大写和0的正确.这是我现在拥有的:
USHORT id = 1127;
std::stringstream ss;
ss << std::showbase << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << id;
std::string result = ss.str();
Run Code Online (Sandbox Code Playgroud)
这导致前缀'0x'也是大写的,但我希望它是小写的.它还导致在前缀0x base(当前为0X)之后没有前缀0到十六进制值.例如,现在将输出0X467而不是预期的0x0467.我该如何解决?
我知道插值是语法糖string.Format(),但它是否有任何特殊的行为/识别何时与字符串格式化方法一起使用?
如果我有一个方法:
void Print(string format, params object[] parameters)
Run Code Online (Sandbox Code Playgroud)
以下使用插值调用它:
Print($"{foo} {bar}");
Run Code Online (Sandbox Code Playgroud)
以下哪个调用行最相当于字符串插值的编译结果?
Print(string.Format("{0} {1}", new[] { foo, bar }));
Print("{0} {1}", new[] { foo, bar });
Run Code Online (Sandbox Code Playgroud)
问题背后的推理:诸如NLog之类的记录框架通常会推迟字符串格式化,直到确定将实际写入日志消息为止.一般来说,我更喜欢字符串插值语法,但我需要知道它是否会产生额外的性能损失.
c# ×3
c#-6.0 ×2
python ×2
binding ×1
boolean ×1
c ×1
c++ ×1
c++11 ×1
curly-braces ×1
date ×1
gcc ×1
gcc-warning ×1
hex ×1
javascript ×1
parsing ×1
printf ×1
python-2.7 ×1
roslyn ×1
rust ×1
string ×1
stringstream ×1
wpf ×1