Как отформатировать число как процент без знака процента?

Есть несколько способов сделать это:

  1. если вы имеете дело только со строковыми литералами, вы можете просто использовать просто строки - размещение одного строкового литерала за другим вызывает компилятор для их объединения.

  2. если могут быть задействованы другие вещи, кроме строковых литералов (т. Е. Вы создаете новые идентификаторы из макросов), используйте оператор вставки токена препроцессора '##. Возможно, вам также понадобится использовать Строковый оператор '#', чтобы превратить ваши макросы в буквальные строки.

Пример # 1:

#ifdef __TESTING
    #define IV_DOMAIN "domain.org"                        //in house testing
#elif __LIVE_TESTING
    #define IV_DOMAIN "test.domain.com"           //live testing servers
#else
    #define IV_DOMAIN "domain.com"                        //production
#endif

// Sub-Domain
#define IV_SECURE "secure." IV_DOMAIN          //secure.domain.org etc
#define IV_MOBILE "m." IV_DOMAIN

И до вставки токена оператор идет, я не думаю, что большинство ответов, в которых предлагалось использовать оператор препроцессора вставки токена, действительно пытались это сделать - это может быть сложно использовать.

Использование часто предлагаемого ответа приведет к ошибка компилятора при попытке использовать макрос IV_SECURE, потому что:

#define IV_SECURE "secure."##IV_DOMAIN

расширяется до:

"secure"domain.org

Возможно, вы захотите попробовать использовать ' # `' оператор 'stringizing':

#define IV_SECURE "secure." #IV_DOMAIN

Но это не сработает, потому что он работает только с аргументами макроса, а не только с любым старым макросом.

Об этом нужно знать, когда вы с использованием Token-Paste ('##') или stringizing ('#') операторы обработки - это то, что вы должны использовать дополнительный уровень косвенности, чтобы они работали должным образом во всех случаях.

Если вы этого не сделаете, а элементы, переданные оператору вставки токена, сами являются макросами, вы Вы получите результаты, которые, вероятно, не соответствуют вашим ожиданиям:

#include <stdio.h>

#define STRINGIFY2( x) #x
#define STRINGIFY(x) STRINGIFY2(x)
#define PASTE2( a, b) a##b
#define PASTE( a, b) PASTE2( a, b)

#define BAD_PASTE(x,y) x##y
#define BAD_STRINGIFY(x) #x

#define SOME_MACRO function_name

int main() 
{
    printf( "buggy results:\n");
    printf( "%s\n", STRINGIFY( BAD_PASTE( SOME_MACRO, __LINE__)));
    printf( "%s\n", BAD_STRINGIFY( BAD_PASTE( SOME_MACRO, __LINE__)));
    printf( "%s\n", BAD_STRINGIFY( PASTE( SOME_MACRO, __LINE__)));

    printf( "\n" "desired result:\n");
    printf( "%s\n", STRINGIFY( PASTE( SOME_MACRO, __LINE__)));
}

Вывод:

buggy results:
SOME_MACRO__LINE__
BAD_PASTE( SOME_MACRO, __LINE__)
PASTE( SOME_MACRO, __LINE__)

desired result:
function_name21

Таким образом, используя ваши исходные IV_DOMAIN определения и макросы утилит сверху, вы можете сделайте это, чтобы получить то, что вы хотите:

// Sub-Domain
#define IV_SECURE "secure." STRINGIFY( IV_DOMAIN)   //secure.domain.org etc
#define IV_MOBILE "m." STRINGIFY( IV_DOMAIN)
22
задан Community 23 May 2017 в 10:30
поделиться

8 ответов

Определите пользовательский язык и региональные параметры с помощью собственного NumberFormatInfo , который возвращает String.Empty для своего свойства PercentSymbol .

Затем используйте эту особую культуру для затронутых страниц (или для всего приложения). Это можно сделать путем клонирования по умолчанию с сохранением других региональных настроек.

16
ответ дан 29 November 2019 в 04:50
поделиться

Почему бы вам просто не умножить число на 100 и использовать строку формата "{0: N0}" ? Мне кажется, что это самое простое решение.

Если вы не найдете вескую причину, почему это исключено, это мой совет.

14
ответ дан 29 November 2019 в 04:50
поделиться

но умножение на 100 - это именно то, что вам нужно!

protected void myGrdiView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        myObjectType ot = (myObjectType)e.Row.DataItem;

        ot.myNumber = ot.myNumber * 100; // multiply by 100
    }
}

и в HTML

<asp:BoundField DataType="myNumber" HeaderText="%" StringFormat="{0:N0}" />
5
ответ дан 29 November 2019 в 04:50
поделиться

В MSDN * в разделе «Строки настраиваемого числового формата» указано следующее:

Наличие символа '%' в строка формата заставляет число быть умножить на 100, прежде чем это будет отформатирован. Соответствующий символ: вставляется в номер в место, где "%" появляется в строка формата. Символ процента используется зависит от текущего NumberFormatInfo class.

Но пример показывает, что он также выводит знак% - не то, что вы хотите, но, возможно, ничего не устанавливает через класс NumberFormatInfo?

Однако я согласен с Pax и не понимаю, почему он Не использовать * 100 и {0: N0}

** Доступ из Visual Studio, поэтому без ссылки *

2
ответ дан 29 November 2019 в 04:50
поделиться

Как насчет этого ...

String.Format("{0:P0}",0.13).Replace("%","")

РЕДАКТИРОВАТЬ: Это должно работать в разных культурах:

var percentSymbol = CultureInfo.CurrentCulture.NumberFormat.PercentSymbol;
String.Format("{0:P0}",0.13).Replace(percentSymbol,"")

Существует также это решение , которое может быть более элегантным, но немного больше кода.

2
ответ дан 29 November 2019 в 04:50
поделиться

Как насчет обрезки?

double d = .102;
string percent = d.ToString("P0").Trim(' ', '%');
0
ответ дан 29 November 2019 в 04:50
поделиться

Пункты, которые следует рассмотреть в первую очередь, процент, отображаемый без%, является числом, поэтому давайте проигнорируем процентный аспект. Вы хотите знать, как отобразить число, которое меньше 1, как 100 или меньше. Я понимаю, что он привязан, поэтому вы не можете изменить его во время отображения, так почему бы не изменить его во время запроса, например, SELECT (значение * 100) AS Percentage, ...?

0
ответ дан 29 November 2019 в 04:50
поделиться

Вы также можете попробовать что-то вроде

string newString = "0.13".Replace("0.", string.Empty) + "%";
0
ответ дан 29 November 2019 в 04:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: