在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) 我正在开展一个项目,我需要在其中显示文本树.我正在尝试使用Java的String.format方法来简化格式化过程,但在尝试应用变量宽度时遇到了麻烦.
当前我有一个变量(一个int),称为深度.
我尝试执行以下操作:
String.format("%"+depth+"s"," ") + getOriginalText() + "\n";
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误.
java.util.FormatFlagsConversionMismatchException: Conversion = s, Flags = 0
Run Code Online (Sandbox Code Playgroud)
关于如何做到这一点的任何建议,还是我应该解决循环问题?
谢谢您的帮助!
我通常使用以下模式(如本问题中所述):
a=1
s= "{a}".format(**locals())
Run Code Online (Sandbox Code Playgroud)
我认为这是编写易读代码的好方法.
有时,"链接"字符串格式是有用的,以便"模块化"复杂字符串的创建:
a="1"
b="2"
c="{a}+{b}".format(**locals())
d="{c} is a sum".format(**locals())
#d=="1+2 is a sum"
Run Code Online (Sandbox Code Playgroud)
很快,代码就被纠缠不清了X.format(**locals()).为了解决这个问题,我尝试创建一个lambda:
f= lambda x: x.format(**locals())
a="1"
b="2"
c= f("{a}+{b}")
d= f("{c} is a sum")
Run Code Online (Sandbox Code Playgroud)
但这引发了一个KeyError,因为locals()是lambda的本地人.
我还尝试仅在最后一个字符串上应用格式:
a="1"
b="2"
c="{a}+{b}"
d="{c} is a sum".format(**locals())
#d=="{a}+{b} is a sum"
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为python只格式化一次.现在,我可以编写一个重复格式化的函数,直到没有其他事情要做:
def my_format( string, vars ):
f= string.format(**vars)
return f if f==string else my_format(f, vars)
Run Code Online (Sandbox Code Playgroud)
但我想知道:有更好的方法吗?
为什么以下输出提供的结果不正确,
int myNumber = 95;
Console.WriteLine(String.Format("{{{0:N}}}", myNumber ));
Run Code Online (Sandbox Code Playgroud)
{N}然后{95.00}按预期输出.
我是否误解了{ } 数字格式逃避或做错事的概念?
我的代码目前显示如下:43521 reviews我希望它是这样的:43,521 reviews.我怎样才能做到这一点?是否有所有可能格式的完整参考StringFormat?找不到任何东西.谢谢.
<TextBlock Text="{Binding Reviews,StringFormat='{}{0} reviews'}"/>
Run Code Online (Sandbox Code Playgroud) 我需要通过调用我的请求中需要JSON数据的服务,将我的iOS应用程序的APNS设备令牌发送给我的提供商.我正在阅读Apple的本地和推送通知编程指南,它只是说application:didRegisterForRemoteNotificationsWithDeviceToken:委托方法传递设备令牌NSData,你应该将它传递给以二进制数据编码的提供者.但是我需要将它转换为字符串才能向我的提供者发送JSON请求.
我也一直在阅读与此相关的几个帖子,因为它看起来是常见的情况,但我发现了一些不同的方法将这样的设备令牌转换为字符串来发送它,我不确定它们应该是哪个是最合适的.处理这个问题最可靠的方法是哪种?我想我的提供者需要将此字符串转换回调用APNS,并且我还需要将此令牌存储在应用程序中,以便在生成并application:didRegisterForRemoteNotificationsWithDeviceToken:调用新令牌时安全地将其与新值进行比较,以发送令牌只有它已经改变了.
谢谢
我们需要一直格式化字符串.能说:真是太好了
std::string formattedStr = format("%s_%06d.dat", "myfile", 18); // myfile_000018.dat
Run Code Online (Sandbox Code Playgroud)
有这样的C++方式吗?我考虑过一些替代方案
snprintf:使用原始char缓冲区.在现代C++代码中不太好用.std::stringstream:不支持格式模式字符串,而是必须将笨拙的iomanip对象推送到流中.boost::format:使用ad-hoc运算符重载%来指定参数.丑陋.现在我们有C++ 11,对于可变参数模板有没有更好的方法?
所以我想对齐包含非ascii字符的字段.以下似乎不起作用:
for word1, word2 in [['hello', 'world'], ['?????', '??']]:
print "{:<20} {:<20}".format(word1, word2)
hello world
????? ??
Run Code Online (Sandbox Code Playgroud)
有解决方案吗?
python unicode string-formatting non-ascii-characters python-2.7
我熟悉使用模板将变量插入字符串的功能,如下所示:
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)
这可能吗?
我正在尝试格式化DateTime结果并将其显示给用户当前设备语言环境中的用户。
目前我可以显示整个DateTime如下:
2018-10-08 16:08:37.464112
或者通过指定这样的确切格式:
DateFormat("dd.MM.yyyy").format(DateTime.now())
Run Code Online (Sandbox Code Playgroud)
结果如下:
08.10.2018
我对这个解决方案的问题是,虽然这种格式在欧盟可能是可以接受的;在例如美国(和许多其他国家/地区),他们习惯于使用不同的日期格式,例如
10/08/2018
我的问题是:如何以当前语言环境的格式仅将日期(而不是时间)返回给用户?
答:
需要检索当前语言环境并将其传递给格式函数。我正在使用自定义本地化类,但使用开箱即用的解决方案,它看起来像这样:
DateFormat.yMMMd(Localizations.localeOf(context)).format(result);
Run Code Online (Sandbox Code Playgroud)