C#技术问题:除法结果保留两位小数与日期格式转换异常排查
两个C#开发问题的解决方案
我来帮你搞定这两个实际开发里的问题,直接上可运行的代码和关键说明:
问题1:除法运算结果保留两位小数
首先要注意整数除法的陷阱:如果直接用两个int类型相除,C#会执行整数除法(直接舍弃小数部分),所以第一步要先把运算数转成浮点类型(比如double或decimal),再进行计算。
这里提供两种常用的实现方式:
方式1:使用ToString格式化(直接输出字符串)
这种方式适合需要直接得到带两位小数的字符串场景:
int dividend = 7; int divisor = 3; // 先转成浮点型再除法,避免整数除法的坑 double result = (double)dividend / divisor; // 用"F2"格式化,强制保留两位小数,不足补零 string formattedResult = result.ToString("F2"); // 输出 "2.33"
方式2:使用Math.Round进行四舍五入(保留数值精度)
如果需要保留数值类型(比如double/decimal)并控制小数位数,推荐用Math.Round,尤其是财务场景建议用decimal保证精度:
decimal num1 = 10m; decimal num2 = 3m; // 用decimal计算精度更高,避免浮点误差 decimal roundedResult = Math.Round(num1 / num2, 2); // 结果是 3.33 // 转成字符串同样用"F2"确保两位小数格式 string resultStr = roundedResult.ToString("F2"); // 输出 "3.33"
问题2:日期格式转换(解决周数补零问题)
你的需求是把dd/mm/yyyy格式的日期转成yyww.d(yy是年份后两位,ww是两位周数,d是星期数字),核心问题是周数要补零成两位,同时要确保周数和星期的计算符合预期。
完整实现代码
using System; using System.Globalization; public class DateConverter { public static string ConvertDate(string inputDate) { // 1. 解析输入的dd/mm/yyyy格式日期,规避系统文化差异影响 if (!DateTime.TryParseExact(inputDate, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime date)) { throw new ArgumentException("输入日期格式不正确,请使用dd/mm/yyyy格式"); } // 2. 获取年份后两位 string yearPart = date.ToString("yy", CultureInfo.InvariantCulture); // 3. 获取周数:指定周一为一周起始,周数规则为"至少包含4天的第一周"(符合ISO标准) Calendar calendar = CultureInfo.InvariantCulture.Calendar; int weekNumber = calendar.GetWeekOfYear( date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday ); // 用"D2"格式化周数,自动补前导零(比如6变成06) string weekPart = weekNumber.ToString("D2", CultureInfo.InvariantCulture); // 4. 获取星期数字:调整默认枚举,让周一=1、周二=2...周日=7(默认DayOfWeek.Sunday=0) int dayNumber = (int)date.DayOfWeek == 0 ? 7 : (int)date.DayOfWeek; // 5. 拼接成目标格式 return $"{yearPart}{weekPart}.{dayNumber}"; } // 测试示例 public static void Main() { // 测试2018年第6周周二(对应日期2018-02-06) string testDate = "06/02/2018"; string result = ConvertDate(testDate); Console.WriteLine(result); // 输出:1806.2 } }
关键说明:
- 周数补零:通过
weekNumber.ToString("D2")实现,D2表示固定两位数字,不足时自动补前导零,完美解决你当前输出186.2的问题。 - 周数计算规则:通过
Calendar.GetWeekOfYear的参数指定周一为一周起始,确保周数计算符合你的预期(不同地区周数规则可能不同,可根据需求调整CalendarWeekRule枚举值)。 - 星期数字调整:C#默认
DayOfWeek.Sunday=0,我们把周日转为7,这样周一到周日对应1-7,完全匹配你的示例需求。
内容的提问来源于stack exchange,提问作者Nikita Sharma
相关产品推荐
相关产品推荐

