Day 2 - 变量与类型
建议用时:180-210 分钟
你将学会什么
- 变量是什么,为什么程序需要变量
- 声明、赋值、读取分别是什么意思
int、decimal、string、bool、DateTime分别适合保存什么- 为什么用户输入先是字符串,不能直接当数字算
TryParse为什么比Parse更适合处理输入null、空字符串、空格字符串有什么区别var是什么,什么时候可以用,什么时候不建议用- 如何写一个“输入商品 -> 转换类型 -> 计算总价 -> 输出结果”的完整程序
本页只讲 C# 基础。不要急着记很多类型,先抓住一句话:变量给数据起名字,类型决定数据能做什么。
本页固定顺序
- 先学第一部分:弄懂今天最小、最重要的知识,并运行短例子。
- 再学第二部分:把刚学的知识组合成一个完整例子。
- 然后做第三部分:自己跟着敲,再完成重复训练和每日小测。
- 最后做第四部分:先独立完成作业,再用完整答案检查。
学习衔接
上一页学习的是“环境搭建与 Hello World”,今天继续学习“变量与类型”。先使用上一页已经会的写法,再只增加今天这个新知识点;如果前置内容还不能独立敲出,先回上一页复习,不要硬跳。
今天的最低通过线
第一次学习不要求背完整页。完成下面 3 项,就可以继续:
- 能用自己的话说明“变量与类型”解决什么问题。
- 把第一部分的短例子亲手敲完,并确认每个例子都能运行。
- 不看完整答案完成第三部分至少前 3 个例子,再主动改一个值观察结果。
第一部分:先学原理和最小知识
这一部分先解决“这是什么、为什么要这样写”。每看到一个短例子就亲手敲一遍并运行,不要先背完整程序。
今天先抓住什么
程序处理的不是一堆散乱文字,而是一份份有含义的数据。
例如:
Keyboard 是商品名称
19.9 是单价
3 是数量
59.70 是总价这些数据要被程序保存、计算和输出,就需要变量和类型。
变量名:负责让你找到这份数据
类型:负责规定这份数据能做什么
值:变量里面真正保存的内容名词先讲清楚
| 名词 | 直接解释 | 例子 |
|---|---|---|
| 变量 | 保存一份数据的名字 | price、count、name |
| 类型 | 规定变量能保存什么 | int、decimal、string |
| 声明 | 告诉 C# 要创建一个变量 | int count; |
| 赋值 | 把右边的值放进左边变量 | count = 3; |
| 读取 | 把变量里的值拿出来用 | Console.WriteLine(count); |
| 字面量 | 直接写在代码里的值 | 3、"Tom"、19.9m |
| 表达式 | 能算出一个结果的一段代码 | price * count |
| 转换 | 把一种类型变成另一种类型 | "18" 转成 18 |
变量到底是什么
变量不是注释,也不是给人看的文字说明。变量是程序真正会使用的数据入口。
int age = 18;
Console.WriteLine(age + 1);这段代码输出:
19原因是:age 里面保存的是数字 18,所以 age + 1 等于 19。
声明、赋值、读取要分开看
int count; // 声明:创建一个整数变量
count = 3; // 赋值:把 3 放进去
Console.WriteLine(count); // 读取:把变量里的值拿出来输出也可以声明和赋值写在一行:
int count = 3;这两种写法最终效果一样。刚开始写代码时,建议优先写后一种,因为变量一出现就有值,更不容易忘记赋值。
类型为什么重要
类型决定变量能不能参与某些操作。
int count = 3;
decimal price = 19.9m;
string name = "Keyboard";
Console.WriteLine(count + 1);
Console.WriteLine(price * count);
Console.WriteLine(name.ToUpper());这里三种变量能做的事不同:
| 变量 | 类型 | 可以做什么 |
|---|---|---|
count | int | 整数计算、比较大小 |
price | decimal | 金额计算、保留小数 |
name | string | 拼接、裁剪、转大小写 |
如果把 name 当成数字去乘,C# 会直接报错。严格类型不是麻烦,它是在帮你提前发现错误。
常用类型怎么选
| 业务数据 | 推荐类型 | 原因 |
|---|---|---|
| 数量、年龄、次数 | int | 都是整数 |
| 很大的整数 | long | 范围比 int 更大 |
| 金额、单价、总价 | decimal | 适合钱,精度更稳定 |
| 普通测量值 | double | 适合一般小数计算 |
| 姓名、编号、备注 | string | 文本内容 |
| 是否通过、是否启用 | bool | 只有 true 或 false |
| 单个字符 | char | 一个字符,例如 'A' |
| 日期时间 | DateTime | 表示时间点 |
常见类型的常用操作方法
只知道类型名字还不够,还要知道这个类型平时能做什么。
下面这些操作先不要求全部背下来,但要知道“遇到什么问题该找哪个方法”。
string 文本常用操作
string 用来保存文本,例如商品名、姓名、编号、备注。
| 操作 | 写法 | 作用 |
|---|---|---|
| 判断空白 | string.IsNullOrWhiteSpace(name) | 判断 null、空字符串、全空格 |
| 去掉前后空格 | name.Trim() | 把 " Tom " 变成 "Tom" |
| 转大写 | name.ToUpper() | 把 "abc" 变成 "ABC" |
| 转小写 | name.ToLower() | 把 "ABC" 变成 "abc" |
| 是否包含 | name.Contains("key") | 判断文本里有没有某段文字 |
| 是否以某段开头 | name.StartsWith("A") | 判断开头 |
| 是否以某段结尾 | name.EndsWith(".txt") | 判断结尾 |
| 替换文字 | name.Replace(" ", "-") | 把空格替换成横线 |
| 取长度 | name.Length | 得到字符数量 |
| 分割文本 | text.Split(',') | 按逗号切成数组 |
| 拼接数组 | string.Join(", ", items) | 把多段文字合成一段 |
完整例子:
string rawName = " keyboard pro ";
string cleanName = rawName.Trim();
Console.WriteLine(cleanName);
Console.WriteLine(cleanName.ToUpper());
Console.WriteLine(cleanName.Contains("key"));
Console.WriteLine(cleanName.Length);
Console.WriteLine(cleanName.Replace(" ", "-"));输出:
keyboard pro
KEYBOARD PRO
True
12
keyboard-proint 整数常用操作
int 用来保存整数,例如数量、年龄、次数、页码。
| 操作 | 写法 | 作用 |
|---|---|---|
| 加法 | a + b | 两个整数相加 |
| 减法 | a - b | 两个整数相减 |
| 乘法 | a * b | 两个整数相乘 |
| 整数除法 | a / b | 两个整数相除,只保留整数部分 |
| 取余数 | a % b | 得到除法余数 |
| 比较大小 | a > b、a <= b | 得到 true 或 false |
| 转字符串 | count.ToString() | 把整数变成文本 |
| 取较大值 | Math.Max(a, b) | 返回较大的数 |
| 取较小值 | Math.Min(a, b) | 返回较小的数 |
完整例子:
int stock = 23;
int pageSize = 5;
Console.WriteLine(stock / pageSize);
Console.WriteLine(stock % pageSize);
Console.WriteLine(Math.Max(stock, 30));
Console.WriteLine(stock > 0);输出:
4
3
30
True这里 23 / 5 输出 4,不是 4.6,因为两个 int 相除还是整数除法。
decimal 金额常用操作
decimal 常用于金额、单价、总价。
| 操作 | 写法 | 作用 |
|---|---|---|
| 金额字面量 | 19.9m | m 表示这是 decimal |
| 加减乘除 | price * count | 计算金额 |
| 保留两位显示 | price.ToString("F2") | 输出成 19.90 |
| 四舍五入 | Math.Round(price, 2) | 保留指定小数位 |
| 比较大小 | price > 0 | 校验金额是否有效 |
完整例子:
decimal price = 19.9m;
int count = 3;
decimal total = price * count;
decimal discount = 0.8m;
decimal finalTotal = total * discount;
Console.WriteLine(total.ToString("F2"));
Console.WriteLine(Math.Round(finalTotal, 2));
Console.WriteLine(finalTotal > 0);输出:
59.70
47.76
Truebool 真假值常用操作
bool 只有两个值:true 和 false。
常用于判断、开关、权限、状态。
| 操作 | 写法 | 作用 |
|---|---|---|
| 取反 | !isEnabled | true 变 false,false 变 true |
| 并且 | a && b | 两个条件都成立才是 true |
| 或者 | a || b | 任意一个条件成立就是 true |
| 等于 | a == b | 判断两个值是否相等 |
| 不等于 | a != b | 判断两个值是否不相等 |
完整例子:
decimal price = 19.9m;
int stock = 3;
bool priceOk = price > 0;
bool stockOk = stock > 0;
bool canSell = priceOk && stockOk;
Console.WriteLine(priceOk);
Console.WriteLine(stockOk);
Console.WriteLine(canSell);
Console.WriteLine(!canSell);输出:
True
True
True
FalseDateTime 日期时间常用操作
DateTime 用来保存一个时间点,例如创建时间、下单时间、过期时间。
| 操作 | 写法 | 作用 |
|---|---|---|
| 当前时间 | DateTime.Now | 当前日期和时间 |
| 今天日期 | DateTime.Today | 今天 00:00:00 |
| 加一天 | date.AddDays(1) | 得到后一天 |
| 加一个月 | date.AddMonths(1) | 得到后一个月 |
| 年 | date.Year | 取年份 |
| 月 | date.Month | 取月份 |
| 日 | date.Day | 取日期 |
| 格式化 | date.ToString("yyyy-MM-dd") | 输出指定格式 |
| 尝试转换 | DateTime.TryParse(text, out DateTime date) | 把文本转成日期 |
完整例子:
DateTime now = DateTime.Now;
DateTime tomorrow = now.AddDays(1);
Console.WriteLine(now.ToString("yyyy-MM-dd HH:mm"));
Console.WriteLine(tomorrow.ToString("yyyy-MM-dd"));
Console.WriteLine(now.Year);输出示例:
2026-06-13 10:30
2026-06-14
2026你的时间会和示例不同,因为 DateTime.Now 读取的是当前电脑时间。
数字字面量为什么有后缀
直接写在代码里的值叫字面量。
int count = 3;
long bigCount = 3000000000L;
double temperature = 36.5;
decimal price = 19.9m;需要注意两个后缀:
| 写法 | 意思 |
|---|---|
3000000000L | L 表示这是 long |
19.9m | m 表示这是 decimal |
金额用 decimal 时,字面量后面要写 m。否则 19.9 默认更接近 double,不能直接放进 decimal 变量。
输入为什么先是字符串
键盘输入进来的内容,程序一开始只能拿到文本。
用户输入:
18程序拿到的是:
string? input = "18";它看起来像数字,但类型还是 string。字符串的 "18" 和数字的 18 不是同一种东西。
Console.WriteLine("18" + "1"); // 181
Console.WriteLine(18 + 1); // 19第一行是字符串拼接,第二行是数字相加。
TryParse 为什么常用
用户输入不一定正确。可能输入 abc、空内容、多个空格,也可能输入 19.9 当数量。
TryParse 的作用是:尝试转换,成功就得到数字,失败就返回 false,程序不会直接崩掉。
string? input = Console.ReadLine();
if (!int.TryParse(input, out int age))
{
Console.WriteLine("年龄必须是整数");
return;
}
Console.WriteLine($"明年年龄: {age + 1}");这段代码里:
| 部分 | 意思 |
|---|---|
int.TryParse | 尝试转成整数 |
input | 原始输入文本 |
out int age | 转换成功后,把结果放到 age |
! | 表示“不是”,也就是转换失败 |
return | 提前结束程序 |
常见转换方法:
| 目标类型 | 写法 | 适合什么输入 |
|---|---|---|
int | int.TryParse(text, out int value) | 数量、年龄、次数 |
decimal | decimal.TryParse(text, out decimal value) | 金额、价格 |
double | double.TryParse(text, out double value) | 一般测量值 |
bool | bool.TryParse(text, out bool value) | true、false |
DateTime | DateTime.TryParse(text, out DateTime value) | 日期时间文本 |
完整转换例子:
string priceText = "19.9";
string countText = "3";
string dateText = "2026-06-13";
bool priceOk = decimal.TryParse(priceText, out decimal price);
bool countOk = int.TryParse(countText, out int count);
bool dateOk = DateTime.TryParse(dateText, out DateTime createdAt);
Console.WriteLine(priceOk);
Console.WriteLine(countOk);
Console.WriteLine(dateOk);
Console.WriteLine(price * count);
Console.WriteLine(createdAt.ToString("yyyy-MM-dd"));输出:
True
True
True
59.7
2026-06-13null、空字符串、空格字符串
用户输入文本时,可能遇到三种情况:
| 情况 | 例子 | 说明 |
|---|---|---|
null | 没有读到内容 | 变量没有有效字符串 |
| 空字符串 | "" | 用户直接回车 |
| 空格字符串 | " " | 用户只输入空格 |
这三种情况都不适合作为商品名称,所以可以统一判断:
Console.Write("商品名称: ");
string? name = Console.ReadLine();
if (string.IsNullOrWhiteSpace(name))
{
Console.WriteLine("商品名称不能为空");
return;
}
Console.WriteLine($"商品名称: {name.Trim()}");var 是什么
var 不是没有类型,也不是可以随便变。
var count = 3; // 编译器推断为 int
var price = 19.9m; // 编译器推断为 decimal
var name = "Tom"; // 编译器推断为 string右边的值决定了真实类型。下面这样不行:
var count = 3;
// count = "Tom"; // 错,count 已经是 int刚开始写 C# 时,基础类型建议先显式写出来:
int count = 3;
decimal price = 19.9m;
string name = "Tom";这样更容易看清类型。
今天写代码时按这个顺序
- 先确定这份数据表示什么业务含义。
- 再选择类型:整数、金额、文本、真假。
- 用户输入先用
string?接收。 - 文本要先判断空值。
- 需要计算时,再用
TryParse转成数字。 - 计算结果用新变量保存。
- 输出金额时用
{total:F2}保留两位小数。
第二部分:把知识组合成完整例子
前面已经学过最小知识。现在把它们组合起来,先读懂执行顺序,再完整敲一遍。先知道今天能写出什么,再去下面拆每一行。
最终你要写出这个程序
Console.Write("商品名称: ");
string? name = Console.ReadLine();
Console.Write("单价: ");
string? priceText = Console.ReadLine();
Console.Write("数量: ");
string? countText = Console.ReadLine();
if (string.IsNullOrWhiteSpace(name))
{
Console.WriteLine("商品名称不能为空");
return;
}
if (!decimal.TryParse(priceText, out decimal price))
{
Console.WriteLine("单价必须是数字");
return;
}
if (!int.TryParse(countText, out int count))
{
Console.WriteLine("数量必须是整数");
return;
}
decimal total = price * count;
Console.WriteLine($"{name.Trim()} x {count} = {total:F2}");正常输入时:
商品名称: Keyboard
单价: 19.9
数量: 3
Keyboard x 3 = 59.70错误输入时:
商品名称: Keyboard
单价: abc
单价必须是数字这个例子里同时出现了文本、金额、整数、真假判断和格式化输出。今天的重点就是把这些数据分清楚。
第三部分:跟着敲代码
从这里开始动手。每个例子都可以直接放进 Program.cs 运行。
动手前先做这 3 件事
- 打开昨天创建的控制台项目,确认
dotnet run能运行。 - 每做一个例子,就把
Program.cs旧内容替换掉。 - 每次只改一个数字或一行输入,观察结果怎么变。
例子 1:变量的声明、赋值、读取
int count = 3;
decimal price = 19.9m;
string name = "Keyboard";
Console.WriteLine(name);
Console.WriteLine(count);
Console.WriteLine(price);预期输出:
Keyboard
3
19.9把 count 改成 5,再运行一次,观察第二行输出变化。
例子 2:数字变量参与计算
decimal price = 19.9m;
int count = 3;
decimal total = price * count;
Console.WriteLine($"单价: {price:F2}");
Console.WriteLine($"数量: {count}");
Console.WriteLine($"总价: {total:F2}");预期输出:
单价: 19.90
数量: 3
总价: 59.70F2 表示输出两位小数。金额输出时很常用。
例子 3:字符串不能直接当数字算
string a = "10";
string b = "2";
Console.WriteLine(a + b);
int x = 10;
int y = 2;
Console.WriteLine(x + y);预期输出:
102
12这个例子要记住:看起来像数字的字符串,仍然是字符串。
例子 4:把输入转成整数
Console.Write("年龄: ");
string? input = Console.ReadLine();
if (!int.TryParse(input, out int age))
{
Console.WriteLine("年龄必须是整数");
return;
}
Console.WriteLine($"明年年龄: {age + 1}");输入 18 时:
年龄: 18
明年年龄: 19输入 abc 时:
年龄: abc
年龄必须是整数例子 5:判断文本是不是空
Console.Write("姓名: ");
string? name = Console.ReadLine();
if (string.IsNullOrWhiteSpace(name))
{
Console.WriteLine("姓名不能为空");
return;
}
string cleanName = name.Trim();
Console.WriteLine($"你好,{cleanName}");这个例子里,Trim() 会去掉前后空格。
例子 6:字符串常用操作
string productName = " Keyboard Pro ";
string cleanName = productName.Trim();
Console.WriteLine($"原始长度: {productName.Length}");
Console.WriteLine($"整理后: {cleanName}");
Console.WriteLine($"整理后长度: {cleanName.Length}");
Console.WriteLine($"大写: {cleanName.ToUpper()}");
Console.WriteLine($"是否包含 key: {cleanName.ToLower().Contains("key")}");
Console.WriteLine($"替换空格: {cleanName.Replace(" ", "-")}");预期输出:
原始长度: 16
整理后: Keyboard Pro
整理后长度: 12
大写: KEYBOARD PRO
是否包含 key: True
替换空格: Keyboard-Pro例子 7:整数、金额和真假判断
decimal price = 19.9m;
int count = 3;
int stock = 10;
decimal total = price * count;
bool hasEnoughStock = stock >= count;
bool priceOk = price > 0;
bool canBuy = hasEnoughStock && priceOk;
Console.WriteLine($"总价: {total:F2}");
Console.WriteLine($"库存够不够: {hasEnoughStock}");
Console.WriteLine($"价格是否有效: {priceOk}");
Console.WriteLine($"能不能购买: {canBuy}");预期输出:
总价: 59.70
库存够不够: True
价格是否有效: True
能不能购买: True例子 8:日期时间常用操作
DateTime createdAt = DateTime.Now;
DateTime expiredAt = createdAt.AddDays(7);
Console.WriteLine($"创建时间: {createdAt:yyyy-MM-dd HH:mm}");
Console.WriteLine($"过期时间: {expiredAt:yyyy-MM-dd}");
Console.WriteLine($"年份: {createdAt.Year}");
Console.WriteLine($"月份: {createdAt.Month}");
Console.WriteLine($"日期: {createdAt.Day}");输出里的日期会根据当前电脑时间变化,重点看格式。
例子 9:完整输入、转换、计算、输出
Console.Write("商品名称: ");
string? name = Console.ReadLine();
Console.Write("单价: ");
string? priceText = Console.ReadLine();
Console.Write("数量: ");
string? countText = Console.ReadLine();
if (string.IsNullOrWhiteSpace(name))
{
Console.WriteLine("商品名称不能为空");
return;
}
if (!decimal.TryParse(priceText, out decimal price))
{
Console.WriteLine("单价必须是数字");
return;
}
if (!int.TryParse(countText, out int count))
{
Console.WriteLine("数量必须是整数");
return;
}
decimal total = price * count;
Console.WriteLine($"{name.Trim()} x {count} = {total:F2}");输入 Keyboard、19.9、3,应该输出:
Keyboard x 3 = 59.70常见错误和修法
| 错误 | 为什么错 | 修法 |
|---|---|---|
| 把用户输入直接当数字算 | ReadLine() 读到的是 string? | 先用 TryParse 转成 int 或 decimal |
金额写成 double | 金额计算容易出现精度问题 | 金额优先用 decimal,字面量加 m |
| 没有处理空名称 | 空格也会被当成商品名 | 用 string.IsNullOrWhiteSpace 判断 |
忘记 Trim() | 前后空格会影响保存和搜索 | 保存前先 name.Trim() |
var 用得太早 | 看不清变量真实类型 | 基础阶段关键变量先写明确类型 |
每日小测
做完本页后,用这 5 题检查是否真的掌握。
1. 判断题
本页的目标不是只把代码运行起来,还要能说清楚“为什么这样写”。
答案:对。能运行只是第一步,能解释原理、常用操作和常见错误,才说明本页内容进入了可复用能力。
2. 填空题
本页主题是:变量与类型。今天至少要掌握的 3 个点是:
1. 变量是什么,为什么程序需要变量
2. 声明、赋值、读取分别是什么意思
3. `int`、`decimal`、`string`、`bool`、`DateTime` 分别适合保存什么答案:以上 3 点必须能用自己的代码跑通,不能只停留在阅读。
3. 流程题
遇到本页相关功能时,先按什么顺序处理?
答案:先看完整例子,确认最终效果;再读原理和名词;然后跟着第三部分从空项目敲代码;最后对照作业答案检查。
4. 找错误题
如果本页代码运行失败,第一步应该做什么?
答案:先看终端或 IDE 里的第一条错误,找到文件名和行号;不要同时改很多地方。再回到本页的“常见错误和修法”表格,对照错误类型逐项排查。
5. 改需求题
在本页完整例子跑通后,至少改一个小需求。
可选改法:
- 改一个字段名称。
- 多加一个校验条件。
- 多输出一行结果。
- 把固定数据改成用户输入。
- 把一次处理改成多条数据处理。
答案标准:修改后能重新运行,并能说明这次修改影响了哪一段逻辑。重点检查:变量是什么,为什么程序需要变量。
上位机专项练习
设备名称、温度、压力、是否在线、采集时间都需要不同类型。今天用上位机数据把变量和类型分清楚。
下面 3 个例子都要亲手敲。先运行原代码,再完成每个例子后面的改动任务。
专项例子 1:保存一台设备的基础状态
string deviceName = "温度传感器-01";
double temperature = 26.5;
bool isOnline = true;
Console.WriteLine(deviceName);
Console.WriteLine(temperature);
Console.WriteLine(isOnline);运行结果或界面效果:
温度传感器-01
26.5
True改动任务: 把温度改成 80.2,把在线状态改成 false。
专项例子 2:把输入转换成采集周期
Console.Write("采集周期(毫秒): ");
string? input = Console.ReadLine();
if (int.TryParse(input, out int interval))
{
Console.WriteLine($"每 {interval} 毫秒采集一次");
}
else
{
Console.WriteLine("采集周期必须是整数");
}运行结果或界面效果:
采集周期(毫秒): 1000
每 1000 毫秒采集一次改动任务: 输入 abc,确认程序走到错误提示。
专项例子 3:记录一次采集时间
DateTime collectedAt = DateTime.Now;
decimal pressure = 1.25m;
Console.WriteLine($"压力: {pressure:F2} MPa");
Console.WriteLine($"采集时间: {collectedAt:yyyy-MM-dd HH:mm:ss}");运行结果或界面效果:
压力: 1.25 MPa
采集时间: 当前日期和时间改动任务: 把单位从 MPa 改成 bar,只改显示文字。
第四部分:作业完整答案
这一部分给出当天作业的完整答案。先按第三部分做一遍,再用这里检查。
作业要求
写一个商品小票程序,要求:
- 输入商品名称。
- 输入单价。
- 输入数量。
- 商品名称不能为空。
- 单价必须是数字。
- 数量必须是整数。
- 输出商品名称、单价、数量、总价。
作业拆解
按这个顺序写,不要跳步:
- 先用
Console.ReadLine()接收三个输入。 - 用
string.IsNullOrWhiteSpace判断商品名称。 - 用
decimal.TryParse转换单价。 - 用
int.TryParse转换数量。 - 用
price * count算总价。 - 用字符串插值输出结果。
完整代码
Console.Write("商品名称: ");
string? name = Console.ReadLine();
Console.Write("单价: ");
string? priceText = Console.ReadLine();
Console.Write("数量: ");
string? countText = Console.ReadLine();
if (string.IsNullOrWhiteSpace(name))
{
Console.WriteLine("商品名称不能为空");
return;
}
if (!decimal.TryParse(priceText, out decimal price))
{
Console.WriteLine("单价必须是数字");
return;
}
if (!int.TryParse(countText, out int count))
{
Console.WriteLine("数量必须是整数");
return;
}
if (price < 0)
{
Console.WriteLine("单价不能小于 0");
return;
}
if (count <= 0)
{
Console.WriteLine("数量必须大于 0");
return;
}
string cleanName = name.Trim();
decimal total = price * count;
Console.WriteLine("----- 小票 -----");
Console.WriteLine($"商品: {cleanName}");
Console.WriteLine($"单价: {price:F2}");
Console.WriteLine($"数量: {count}");
Console.WriteLine($"总价: {total:F2}");正确运行结果
正常输入:
商品名称: Keyboard
单价: 19.9
数量: 3
----- 小票 -----
商品: Keyboard
单价: 19.90
数量: 3
总价: 59.70单价错误:
商品名称: Keyboard
单价: abc
数量: 3
单价必须是数字数量错误:
商品名称: Keyboard
单价: 19.9
数量: 2.5
数量必须是整数你要能说清楚这 6 件事
string? name保存用户输入的商品名称。decimal price保存单价,因为金额适合用decimal。int count保存数量,因为数量应该是整数。TryParse用来安全转换输入。return用来在错误输入时提前结束程序。{total:F2}用来把金额输出成两位小数。
加强作业:商品小票加常用方法
这道题专门练常见类型的常用操作。
要求:
- 输入商品名称。
- 输入单价。
- 输入购买数量。
- 输入库存数量。
- 商品名称要去掉前后空格。
- 商品名称统一显示成大写。
- 单价和总价保留两位小数。
- 判断库存是否足够。
- 输出当前打印小票的日期。
完整答案:
Console.Write("商品名称: ");
string? nameText = Console.ReadLine();
Console.Write("单价: ");
string? priceText = Console.ReadLine();
Console.Write("购买数量: ");
string? countText = Console.ReadLine();
Console.Write("库存数量: ");
string? stockText = Console.ReadLine();
if (string.IsNullOrWhiteSpace(nameText))
{
Console.WriteLine("商品名称不能为空");
return;
}
if (!decimal.TryParse(priceText, out decimal price))
{
Console.WriteLine("单价必须是数字");
return;
}
if (!int.TryParse(countText, out int count))
{
Console.WriteLine("购买数量必须是整数");
return;
}
if (!int.TryParse(stockText, out int stock))
{
Console.WriteLine("库存数量必须是整数");
return;
}
if (price <= 0)
{
Console.WriteLine("单价必须大于 0");
return;
}
if (count <= 0)
{
Console.WriteLine("购买数量必须大于 0");
return;
}
if (stock < 0)
{
Console.WriteLine("库存数量不能小于 0");
return;
}
string cleanName = nameText.Trim();
string displayName = cleanName.ToUpper();
decimal total = price * count;
bool hasEnoughStock = stock >= count;
DateTime printedAt = DateTime.Now;
Console.WriteLine();
Console.WriteLine("----- 商品小票 -----");
Console.WriteLine($"打印日期: {printedAt:yyyy-MM-dd HH:mm}");
Console.WriteLine($"商品: {displayName}");
Console.WriteLine($"单价: {price:F2}");
Console.WriteLine($"购买数量: {count}");
Console.WriteLine($"库存数量: {stock}");
Console.WriteLine($"库存是否足够: {hasEnoughStock}");
Console.WriteLine($"总价: {total:F2}");正常输入:
商品名称: keyboard pro
单价: 199.9
购买数量: 2
库存数量: 10
----- 商品小票 -----
打印日期: 2026-06-13 10:30
商品: KEYBOARD PRO
单价: 199.90
购买数量: 2
库存数量: 10
库存是否足够: True
总价: 399.80这里用到了这些常见方法和操作:
| 代码 | 作用 |
|---|---|
string.IsNullOrWhiteSpace(nameText) | 判断名称是不是空 |
nameText.Trim() | 去掉前后空格 |
cleanName.ToUpper() | 转成大写显示 |
decimal.TryParse(...) | 把单价文本转成金额 |
int.TryParse(...) | 把数量文本转成整数 |
stock >= count | 判断库存是否足够 |
{price:F2} | 金额保留两位小数 |
DateTime.Now | 获取当前时间 |
{printedAt:yyyy-MM-dd HH:mm} | 按指定格式输出日期时间 |