小编tjs*_*ith的帖子

使用自定义组和小数分隔符将数字格式化为字符串,而不更改精度

我想使用自定义组/千位分隔符和小数分隔符将一些数字格式化为 C# 中的字符串。组和小数点分隔符可以根据用户输入进行更改,因此我想使用 NumberFormatInfo 对象而不是硬编码的格式化字符串。我下面的代码获得了正确的分隔符,但它将数字的精度更改为始终为小数点后两位,而我想保持数字的完整精度,并且仅在需要时显示小数位(因此整数值没有小数位) 。

我怎样才能实现这个目标?我猜我需要更改“N”参数,但是将其更改为什么?

double n1 = 1234;
double n2 = 1234.5;
double n3 = 1234567.89;
double n4 = 1234.567;

var nfi = new NumberFormatInfo();
nfi.NumberDecimalSeparator = ",";
nfi.NumberGroupSeparator = " ";

string s1 = n1.ToString("N", nfi); //want "1 234" but I get "1 234,00"
string s2 = n2.ToString("N", nfi); //want "1 234,5" but I get "1 234,50"
string s3 = n3.ToString("N", nfi); //correct output of "1 234 567,89" 
string s4 = n4.ToString("N", nfi); //want " 1 …
Run Code Online (Sandbox Code Playgroud)

c# tostring number-formatting

3
推荐指数
1
解决办法
5734
查看次数

将系统剪贴板读为流而不是字符串

如果我在系统剪贴板上有大量文本(例如150MB文本文件),我希望能够从流中读取系统剪贴板作为Unicode文本,以避免OutOfMemoryException.这可以通过调整下面的pinvoke示例来实现吗?

对于这些非常大的剪贴板,Clipboard.GetText(TextDataFormat.UnicodeText)将返回一个空字符串而不会抛出异常.

或者,如果我像这里的示例一样使用pinvoke,我将得到一个OutOfMemoryException http://komalmangal.blogspot.ca/2016/04/how-to-get-clipboard-data-and-its-size.html

    [DllImport("user32.dll")]
    static extern IntPtr GetClipboardData(uint uFormat);
    [DllImport("user32.dll")]
    static extern bool IsClipboardFormatAvailable(uint format);
    [DllImport("user32.dll", SetLastError = true)]
    static extern bool OpenClipboard(IntPtr hWndNewOwner);
    [DllImport("user32.dll", SetLastError = true)]
    static extern bool CloseClipboard();
    [DllImport("kernel32.dll")]
    static extern IntPtr GlobalLock(IntPtr hMem);
    [DllImport("kernel32.dll")]
    static extern bool GlobalUnlock(IntPtr hMem);

    const uint CF_UNICODETEXT = 13;
    public static string GetText()
    {
        if (!IsClipboardFormatAvailable(CF_UNICODETEXT))
            return null;
        if (!OpenClipboard(IntPtr.Zero))
            return null;

        string data = null;
        var hGlobal = GetClipboardData(CF_UNICODETEXT);
        if (hGlobal != IntPtr.Zero)
        {
            var lpwcstr = GlobalLock(hGlobal); …
Run Code Online (Sandbox Code Playgroud)

c# clipboard pinvoke winapi stream

2
推荐指数
1
解决办法
490
查看次数

标签 统计

c# ×2

clipboard ×1

number-formatting ×1

pinvoke ×1

stream ×1

tostring ×1

winapi ×1