in src/NuGet.Core/NuGet.Frameworks/FrameworkNameProvider.cs [208:280]
public string GetVersionString(string framework, Version version)
{
if (version is null || IsZero(version))
{
return string.Empty;
}
int major = version.Major > 0 ? version.Major : 0;
int minor = version.Minor > 0 ? version.Minor : 0;
int build = version.Build > 0 ? version.Build : 0;
int revision = version.Revision > 0 ? version.Revision : 0;
// Remove all trailing zeros beyond the minor version.
int partCount = (minor == 0, build == 0, revision == 0) switch
{
(true, true, true) => 1,
(false, true, true) => 2,
(_, false, true) => 3,
(_, _, false) => 4
};
// Only some legacy frameworks are allowed to have one part in their version.
if (partCount == 1 && !SingleDigitVersionFrameworks.Contains(framework))
{
partCount = 2;
}
StringBuilder sb = StringBuilderPool.Shared.Rent(256);
// Some frameworks require a decimal point between parts.
// If any part is greater than 9 (requiring multiple digits), we add decimal points.
if (DecimalPointFrameworks.Contains(framework) || HasGreaterThanNinePart())
{
// An additional zero is needed for decimals.
if (partCount == 1)
partCount = 2;
sb.AppendInt(major);
if (partCount > 1)
sb.Append('.').AppendInt(minor);
if (partCount > 2)
sb.Append('.').AppendInt(build);
if (partCount > 3)
sb.Append('.').AppendInt(revision);
}
else
{
sb.AppendInt(major);
if (partCount > 1)
sb.AppendInt(minor);
if (partCount > 2)
sb.AppendInt(build);
if (partCount > 3)
sb.AppendInt(revision);
}
return StringBuilderPool.Shared.ToStringAndReturn(sb);
bool HasGreaterThanNinePart()
{
return major > 9 || minor > 9 || build > 9 || revision > 9;
}
static bool IsZero(Version version)
{
// Build and Revision can be -1 when only major & minor are specified.
// Out of caution, check all values for zero or less.
return version.Major <= 0
&& version.Minor <= 0
&& version.Build <= 0
&& version.Revision <= 0;
}
}