2015-11-30 6 views
1

Я прочитал csv-файл и колонки разделены запятой. В некоторых культурах разделитель является точкой, и по этой причине я решил изменить текущую культуру на «en-US», которые используют запятую для разделителя. Но после того, как я закончил с некоторой операцией, мне нужно вернуться в культуру, которую использовал пользователь. Но я не могу.Как можно вернуться к текущей культуре, которую пользователь использовал на ПК

Как вернуть текущую культуру, которую пользователь использовал?

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US"); 
// do something 
CultureInfo ci = CultureInfo.CurrentCulture; 
var a = ci.DisplayName; 

ли продолжать быть "EN-US"

+0

Я не понимаю ваш вопрос четко. Вы хотите вернуть '' en-US "' как 'string'? Просто верните 'ci.Name'? –

+0

Вероятно, вы не хотите изменять текущую культуру только для чтения csv-файла, так как это может иметь нежелательные побочные эффекты. Вы должны изменить свой код, который обращается к csv, чтобы использовать его собственную культуруinfo и использовать перегрузки метода, которые принимают IFormatProvider. –

+0

Я сохраняю культуру до смены и теперь хорошо работает. С двумя строками код работает таким образом, что я хочу. Спасибо за помощь Дмитрию Быченко и Диону В. –

ответ

1
//Save your current culture; 
var myCurrentCulture = Thread.CurrentThread.CurrentCulture; 

//Adjust the culture 
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US"); 

//Set it back 
Thread.CurrentThread.CurrentCulture = myCurrentCulture; 

CultureInfo ci = CultureInfo.CurrentCulture; 
var a = ci.DisplayName; 
2

Просто сохранить и затем восстановить:

var saved = Thread.CurrentThread.CurrentCulture; 

try { 
    Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US"); 
    // do something 
finally { 
    Thread.CurrentThread.CurrentCulture = saved; 
} 

Другой (немного экзотическое) possibity чтобы скрыть логика в специально разработанном классе:

public sealed class CurrentCulture: IDisposable { 
    private CultureInfo m_Saved; 

    public CurrentCulture(CultureInfo info) { 
    //TODO: validate info 
    m_Saved = Thread.CurrentThread.CurrentCulture; 
    Thread.CurrentThread.CurrentCulture = info; 
    } 

    public CurrentCulture(String name) : 
    this(new CultureInfo(name)) { 
    } 

    public void Dispose() { 
    if (m_Saved != null) { 
     Thread.CurrentThread.CurrentCulture = m_Saved; 
     m_Saved = null; 
    } 
    } 
} 

... 

using (var c = new CurrentCulture("en-US")) { 
    // do something 
} 
+0

Ну, это неудобно. Могу ли я спросить, почему вы помещаете 'Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo (« en-US »);' в блок 'try'? Он вызывает только «ArgumentNullException», но это то, что вы хотите поймать? –

+0

@Dion V: технически вы можете поместить 'Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo (« en-US »);' * out * of 'try', это просто мой habiit: что бы ни случилось (например,' ' en-US "' * not found *) Я хочу быть уверенным, что 'Thread.CurrentThread.CurrentCulture = saved;' будет вызываться, и, следовательно, культура будет восстановлена. –

+0

Забыл о части 'finally', на месте. –