首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将DateTimeFormatInfo.CurrentInfo和NumberFormatInfo.CurrentInfo设置为不变?

如何将DateTimeFormatInfo.CurrentInfo和NumberFormatInfo.CurrentInfo设置为不变?
EN

Stack Overflow用户
提问于 2019-03-27 07:37:42
回答 1查看 855关注 0票数 1

我正在重构一些单元测试,发现一些解析策略依赖于DateTime.TryParseExactsbyte.TryPase,它们本身依赖于NumberFormatInfo.CurrentInfoDateTimeFormatInfo.CurrentInfo

为了使我的单元测试得到适当的安排,我决定通过以下方法将NumberFormatInfoDateTimeFormatInfoDateTimeFormatInfo属性设置为它们不变的味道:

代码语言:javascript
复制
CultureInfo.CurrentCulture = CultureInfo.InvariantCulture;

然而,出于好奇,我试图通过一个单元测试来检查各自的InvariantInfo是否被设置,结果发现不,它们不是。我想知道在这两个CurrentInfo中,我缺少了什么来执行CurrentInfo

代码语言:javascript
复制
[Fact]
public void ShouldReturnInvariantInfo()
{
    CultureInfo.CurrentCulture.NumberFormat = NumberFormatInfo.InvariantInfo;
    CultureInfo.CurrentCulture.DateTimeFormat = DateTimeFormatInfo.InvariantInfo;
    NumberFormatInfo.CurrentInfo.Should().Be(NumberFormatInfo.InvariantInfo);
    DateTimeFormatInfo.CurrentInfo.Should().Be(DateTimeFormatInfo.InvariantInfo);
}

知道基本的实现:

NumberFormatInfo.InvariantInfo

代码语言:javascript
复制
public static NumberFormatInfo CurrentInfo
{
  get
  {
    CultureInfo currentCulture = CultureInfo.CurrentCulture;
    if (!currentCulture._isInherited)
    {
      NumberFormatInfo numInfo = currentCulture.numInfo;
      if (numInfo != null)
        return numInfo;
    }
    return (NumberFormatInfo) currentCulture.GetFormat(typeof (NumberFormatInfo));
  }
}

DateTimeFormatInfo.CurrentInfo

代码语言:javascript
复制
public static DateTimeFormatInfo CurrentInfo
{
  get
  {
    CultureInfo currentCulture = CultureInfo.CurrentCulture;
    if (!currentCulture._isInherited)
    {
      DateTimeFormatInfo dateTimeInfo = currentCulture.dateTimeInfo;
      if (dateTimeInfo != null)
        return dateTimeInfo;
    }
    return (DateTimeFormatInfo) currentCulture.GetFormat(typeof (DateTimeFormatInfo));
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-27 07:48:32

如果我对您的理解是正确的,您希望在区域性下运行一些代码(测试),它是Current one,除了NumberFormatDateTimeFormat,它们是Invariant。如果是您的情况,我建议Clone当前的文化并修改克隆:

代码语言:javascript
复制
// Current culture clone
CultureInfo testCulture = CultureInfo.CurrentCulture.Clone() as CultureInfo;

// modified: current culture except Number and DateTime which are Invariant
testCulture.NumberFormat = CultureInfo.InvariantCulture.NumberFormat;
testCulture.DateTimeFormat = CultureInfo.InvariantCulture.DateTimeFormat;

// and, finally, set back as current
CultureInfo.CurrentCulture = testCulture;

让我们看一下格式

代码语言:javascript
复制
Console.Write(ReferenceEquals(CultureInfo.CurrentCulture.DateTimeFormat,
                              CultureInfo.InvariantCulture.DateTimeFormat) 
     ? "Equals" 
     : "Not Equals");

结果:

代码语言:javascript
复制
Equals

编辑:为了运行代码using修改后的区域性,我们可以为它实现一个类:

代码语言:javascript
复制
  public class TestCulture : IDisposable {
    private CultureInfo m_SavedCulture; 
    private CultureInfo m_TestCulture;
    private bool m_IsDisposed;

    public TestCulture() {
      m_SavedCulture = CultureInfo.CurrentCulture; 

      m_TestCulture = CultureInfo.CurrentCulture.Clone() as CultureInfo;
      m_TestCulture.NumberFormat = CultureInfo.InvariantCulture.NumberFormat;
      m_TestCulture.DateTimeFormat = CultureInfo.InvariantCulture.DateTimeFormat;

      CultureInfo.CurrentCulture = m_TestCulture;
    }

    protected vitrual void Dispose(bool disposing) {
      if (disposing) {
        if (!m_IsDisposed && ReferenceEquals(CultureInfo.CurrentCulture, m_TestCulture)) {
          CultureInfo.CurrentCulture = m_SavedCulture;

          m_IsDisposed = true;
        }
      }
    }

    public void Dispose() => Dispose(true);
  }

然后按以下方式使用:

代码语言:javascript
复制
  using (new TestCulture()) {
    // Tests which should be run under the specific culture
  }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55371994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档