我需要无损地表示字符串中的双精度浮点数,因此我正在使用
var reqs = new BatchUpdateSpreadsheetRequest();
reqs.Requests = new List<Request>();
string[] colNames = new [] { "timestamp", "videoid", "videoname", "firstname", "lastname", "email" };
// Create starting coordinate where data would be written to
GridCoordinate gc = new GridCoordinate();
gc.ColumnIndex = 0;
gc.RowIndex = 0;
gc.SheetId = SHEETID; // Your specific sheet ID here
rq = new Request();
rq.UpdateCells = new UpdateCellsRequest();
rq.UpdateCells.Start = gc;
rq.UpdateCells.Fields = "*"; // needed by API, throws error if null
// Assigning data to cells
RowData rd = new RowData();
List<CellData> lcd = new List<CellData>();
foreach (String column in colNames)
{
ExtendedValue ev = new ExtendedValue();
ev.StringValue = column;
CellData cd = new CellData();
cd.UserEnteredValue = ev;
lcd.Add(cd);
}
rd.Values = lcd;
// Put cell data into a row
List<RowData> lrd = new List<RowData>();
lrd.Add(rd);
rq.UpdateCells.Rows = lrd;
// It's a batch request so you can create more than one request and send them all in one batch. Just use reqs.Requests.Add() to add additional requests for the same spreadsheet
reqs.Requests.Add(rq);
// Execute request
response = sheetsService.Spreadsheets.BatchUpdate(reqs, Spreadsheet.SpreadsheetId).Execute(); // Replace Spreadsheet.SpreadsheetId with your recently created spreadsheet ID
这在我的系统上工作正常,但是当在Windows下的MinGW上构建时,会发出警告:
sprintf(buf, "%la", x);
我编写了针对此案例的解决方法,但无法检测何时应该使用该解决方法 - 我尝试unknown conversion type character 'a' in format
,但似乎Gcc / MinGW定义即使它不支持{{1 }}。还有我可以检查的另一个宏吗?
答案 0 :(得分:3)
这不回答“如何检测printf是否支持%a?”的问题。在一般情况下,您可以修改编译器安装,以便支持%a
。
首先,使用mingw-w64。这是MinGW的最新版本。 MinGW的原始版本维护得不好,并且不能修复您遇到的错误(更喜欢责怪微软等)。
在Windows 10中使用mingw-w64 4.9.2,以下代码适用于我:
#include <stdio.h>
int main()
{
double x = 3.14;
printf("%a\n", x);
}
生成0x1.91eb85p+1
这是正确的。这仍然是推迟到Microsoft运行时。
您的问题提及%la
,但%a
和%la
都相同,可用于打印float
或double
参数。
如果要打印long double
,则Microsoft运行时不支持; gcc和MS使用不同大小的long double
。你必须使用mingw-w64自己的printf实现:
#define __USE_MINGW_ANSI_STDIO 1
#include <stdio.h>
int main()
{
long double x = 3.14;
printf("%La\n", x);
}
输出0xc.8f5c28f5c28f8p-2
。这实际上是与0x1.91eb85p+1
相同的数字,具有更高的精度和二进制点的不同位置,它也是正确的。
答案 1 :(得分:2)
正如jxh已经怀疑的那样,MingW使用Windows中的MSVCRT LibC。 C99支持不完整,尤其缺少printf(3)
a
之类的一些选项。