string.Format是一种非常危险的方法.有很多东西可能出错,没有任何编译错误:
string.Format("{0{", text);
string.Format("{1}", text);
string.Format("(0)", text);
string.Format("{0}", text1, text2);
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种在编译时找到这个问题的方法.如果我没记错的话,Resharper发现了一些错误,但它对我的血液来说太丰富了.
我有一个程序来处理嵌套数据结构,其中底层类型通常最终为小数.例如
x={'a':[1.05600000001,2.34581736481,[1.1111111112,9.999990111111]],...}
Run Code Online (Sandbox Code Playgroud)
是否有一种简单的pythonic方法来打印这样的变量,但将所有浮点数舍入到(例如)3dp并且不假设列表和字典的特定配置?例如
{'a':[1.056,2.346,[1.111,10.000],...}
Run Code Online (Sandbox Code Playgroud)
我想的是
pformat(x,round=3)或许也许
pformat(x,conversions={'float':lambda x: "%.3g" % x})
Run Code Online (Sandbox Code Playgroud)
除了我不认为他们有这种功能.永久舍入基础数据当然不是一种选择.
有没有标准或至少广泛实现的东西String.format,但有命名参数?
我想以这样的方式格式化一个模板化的字符串:
Map<String, Object> args = new HashMap<String, Object>();
args.put("PATH", "/usr/bin");
args.put("file", "foo");
String s = someHypotheticalMethod("#{PATH}/ls #{file}");
// "/usr/bin/ls foo"
Run Code Online (Sandbox Code Playgroud)
从技术上讲,它几乎与:
String[] args = new String[] { "/usr/bin", "foo" };
String s = String.format("%1$s/ls %2$s", args);
// "/usr/bin/ls foo"
Run Code Online (Sandbox Code Playgroud)
但是有了命名参数.
我知道:
但是他们都使用有序或至少编号的参数,而不是命名参数.我知道实现一个是微不足道的,但是我是否正在寻找标准Java库中的机制,或者至少在Apache Commons/Guava /类似的东西中,而不引入高调的模板引擎?
注意:我对真正的模板引擎并不感兴趣,它具有一些命令/功能逻辑,流控制,修饰符,子模板/包含,迭代器等功能.通常,以下方法是一个有效的4行实现 - 这就是我所需要的:
public static String interpolate(String format, Map<String, ? extends Object> args) {
String out = format;
for (String arg : args.keySet()) {
out = Pattern.compile(Pattern.quote("#{" + arg …Run Code Online (Sandbox Code Playgroud) 请考虑以下字符串构建语句:
s="svn cp %s/%s/ %s/%s/" % (root_dir, trunk, root_dir, tag)
Run Code Online (Sandbox Code Playgroud)
使用四个%s可能会令人困惑,所以我更喜欢使用变量名:
s="svn cp {root_dir}/{trunk}/ {root_dir}/{tag}/".format(**SOME_DICTIONARY)
Run Code Online (Sandbox Code Playgroud)
何时root_dir,tag并且trunk在一个类的范围内定义,使用self.__dict__效果很好:
s="svn cp {root_dir}/{trunk}/ {root_dir}/{tag}/".format(**self.__dict__)
Run Code Online (Sandbox Code Playgroud)
但是当变量是本地的时,它们没有在字典中定义,所以我使用字符串连接代替:
s="svn cp "+root_dir+"/"+trunk+"/ "+root_dir+"/"+tag+"/"
Run Code Online (Sandbox Code Playgroud)
我发现这个方法很混乱,但我不知道使用内联局部变量构造字符串的任何方法.
当变量是本地变量时,如何使用变量名构造字符串?
更新:使用该locals()功能完成了诀窍.
请注意,允许混合局部变量和对象变量!例如,
s="svn cp {self.root_dir}/{trunk}/ {self.root_dir}/{tag}/".format(**locals())
Run Code Online (Sandbox Code Playgroud) 我非常喜欢用Python打印的新常规 .format()
是否可以使用它逐行打印元素.当然假设元素数量未知.
工作实例将不胜感激.
我希望能够使用VBA在1-24之间显示任意数字作为2位数字.显然,唯一有问题的是1-9,我想显示为01,02,03等.有没有办法执行此操作?
我想格式化字符串,并能够使用点操作,这样我就可以构建含有例如模板字符串{user.name},{product.price}.
我试过这个:
'Hello {user.name}'.format( {'user': { 'name': 'Markus' } } )
KeyError: 'user'
'Hello {user.name}'.format( **{'user': { 'name': 'Markus' } } )
AttributeError: 'dict' object has no attribute 'name'
Run Code Online (Sandbox Code Playgroud)
有办法吗?
我想在Controller中为我的模型设置一个默认值,但它无法在创建页面中显示.
TestModel代码:
public class TestModel
{
[DataType(DataType.DateTime), Required]
[DisplayFormat(DataFormatString = "yyyy/MM/dd", ApplyFormatInEditMode = true)]
public DateTime StartTime { get; set; }
[DataType(DataType.DateTime), Required]
[DisplayFormat(DataFormatString = "yyyy/MM/dd", ApplyFormatInEditMode = true)]
public DateTime EndTime { get; set; }
public string Description { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
控制器代码:
public ActionResult Create()
{
var model = new TestModel();
model.StartTime = DateTime.Now;
model.EndTime = DateTime.Now.AddDays(10);
model.Description = "This is a default value";
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
查看页面:
<div class="form-group">
@Html.LabelFor(model => model.StartTime, htmlAttributes: new { @class …Run Code Online (Sandbox Code Playgroud) 在Java中处理浮点值时,调用toString()方法会给出一个打印值,该值具有正确的浮点数有效数字.但是,在C++中,通过stringstream打印float会在5位或更少位数后对值进行舍入.有没有办法将C++中的浮点数"漂亮地打印"到(假定的)正确数字的有效数字?
编辑:我想我被误解了.我希望输出是动态长度,而不是固定的精度.我熟悉setprecision.如果你看一下Double的java源代码,它会以某种方式计算有效数字的数量,我真的想了解它是如何工作的和/或在C++中轻松复制它的可行性.
/*
* FIRST IMPORTANT CONSTRUCTOR: DOUBLE
*/
public FloatingDecimal( double d )
{
long dBits = Double.doubleToLongBits( d );
long fractBits;
int binExp;
int nSignificantBits;
// discover and delete sign
if ( (dBits&signMask) != 0 ){
isNegative = true;
dBits ^= signMask;
} else {
isNegative = false;
}
// Begin to unpack
// Discover obvious special cases of NaN and Infinity.
binExp = (int)( (dBits&expMask) >> expShift );
fractBits = dBits&fractMask;
if ( binExp == (int)(expMask>>expShift) ) …Run Code Online (Sandbox Code Playgroud) 我熟悉使用模板将变量插入字符串的功能,如下所示:
Template('value is between $min and $max').substitute(min=5, max=10)
Run Code Online (Sandbox Code Playgroud)
我现在想知道的是,是否可以反过来.我想取一个字符串,并使用模板从中提取值,以便我有一些包含提取值的数据结构(最好只是命名变量,但dict很好).例如:
>>> string = 'value is between 5 and 10'
>>> d = Backwards_template('value is between $min and $max').extract(string)
>>> print d
{'min': '5', 'max':'10'}
Run Code Online (Sandbox Code Playgroud)
这可能吗?