Есть несколько способов сделать это:
если вы имеете дело только со строковыми литералами, вы можете просто использовать просто строки - размещение одного строкового литерала за другим вызывает компилятор для их объединения.
если могут быть задействованы другие вещи, кроме строковых литералов (т. Е. Вы создаете новые идентификаторы из макросов), используйте оператор вставки токена препроцессора '##
. Возможно, вам также понадобится использовать Строковый оператор '#
', чтобы превратить ваши макросы в буквальные строки.
Пример # 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)
Определите пользовательский язык и региональные параметры с помощью собственного NumberFormatInfo
, который возвращает String.Empty
для своего свойства PercentSymbol
.
Затем используйте эту особую культуру для затронутых страниц (или для всего приложения). Это можно сделать путем клонирования по умолчанию с сохранением других региональных настроек.
Почему бы вам просто не умножить число на 100 и использовать строку формата "{0: N0}"
? Мне кажется, что это самое простое решение.
Если вы не найдете вескую причину, почему это исключено, это мой совет.
но умножение на 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}" />
В MSDN * в разделе «Строки настраиваемого числового формата» указано следующее:
Наличие символа '%' в строка формата заставляет число быть умножить на 100, прежде чем это будет отформатирован. Соответствующий символ: вставляется в номер в место, где "%" появляется в строка формата. Символ процента используется зависит от текущего NumberFormatInfo class.
Но пример показывает, что он также выводит знак% - не то, что вы хотите, но, возможно, ничего не устанавливает через класс NumberFormatInfo?
Однако я согласен с Pax и не понимаю, почему он Не использовать * 100 и {0: N0}
** Доступ из Visual Studio, поэтому без ссылки *
Как насчет этого ...
String.Format("{0:P0}",0.13).Replace("%","")
РЕДАКТИРОВАТЬ: Это должно работать в разных культурах:
var percentSymbol = CultureInfo.CurrentCulture.NumberFormat.PercentSymbol;
String.Format("{0:P0}",0.13).Replace(percentSymbol,"")
Существует также это решение , которое может быть более элегантным, но немного больше кода.
Как насчет обрезки?
double d = .102;
string percent = d.ToString("P0").Trim(' ', '%');
Пункты, которые следует рассмотреть в первую очередь, процент, отображаемый без%, является числом, поэтому давайте проигнорируем процентный аспект. Вы хотите знать, как отобразить число, которое меньше 1, как 100 или меньше. Я понимаю, что он привязан, поэтому вы не можете изменить его во время отображения, так почему бы не изменить его во время запроса, например, SELECT (значение * 100) AS Percentage, ...?
Вы также можете попробовать что-то вроде
string newString = "0.13".Replace("0.", string.Empty) + "%";