我正在寻找如何设置(和获取)位数(LOCALE_IDIGITS)的示例。
背景:我正在使用COM自动化(客户端:Python,服务器:ACCESS,包:pywin32)。使用 TransferText 时,它总是打印 2 位小数。 (参见例如https://social.msdn.microsoft.com/Forums/office/en-US/5bba131c-d6cd-4548-9f0f-c85947b3d81d/access-2010-export-text-truncates-numbers-to-two- decimal-places?forum=accessdev 对于其他遇到此问题的人)。实际上,事实证明,这是由于语言环境设置所致。在 Windows 下,语言环境有一个名为 LOCALE_IDIGITS 的设置:
小数点后的小数位数。这 此字符串允许的最大字符数为两个,包括 终止空字符。例如,2 表示 5.00,1 表示 5.0。
因此,因此,我想更改应用程序的区域设置,以便访问功能将以完全精确的方式写入 CSV 文件(比如 16 位或 8 位小数)。我不介意示例是使用不同的语言还是正在更改类似的设置。我假设 get 和 set 是对称的,所以其中一个应该足以让我继续。
这是答案的第一部分。 C++ 中的 Get 部分演示如下:
#include <Windows.h>
#include <Winnls.h>
#include <stdio.h>
int GetNumberOfDigitsForDecimal()
{
const int stringsize = 2; // docs for LOCALE_IDIGITS says this won't be more than 2 including the null char
wchar_t value[stringsize] = {};
GetLocaleInfoEx(LOCALE_NAME_USER_DEFAULT, LOCALE_NOUSEROVERRIDE|LOCALE_IDIGITS, value, stringsize);
return _wtoi(value);
}
(来源:Microsoft locale how to get no of digits after decimal place?)用字符串来传递一个小整数有点奇怪
据我所知,没有相应的
SetLocaleInfoEx
,Pythonpywin32
包似乎也没有(get或set)。
有一个
SetLocaleInfoA
(同样不在pywin32中),但是文档https://learn.microsoft.com/en-us/windows/win32/api/winnls/nf-winnls-setlocaleinfoa警告不要使用它:
注意因为此功能修改所有应用程序的值, 它应该只被区域和语言选项调用 控制面板或类似实用程序的功能。如果制作一个 系统参数的国际更改,调用应用程序 必须广播 WM_SETTINGCHANGE 消息以避免引起 其他应用程序的不稳定性。
我认为这意味着没有简单可靠的可编程方法来设置
TransferText
的小数位数。