You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.8 KiB
88 lines
2.8 KiB
3 months ago
|
using System;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Linq;
|
||
|
using System.Text;
|
||
|
|
||
|
namespace Kean.Domain.Order.Models
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// 单号格式
|
||
|
/// </summary>
|
||
|
public class Format
|
||
|
{
|
||
|
private readonly IEnumerable<string> _span; // 片段
|
||
|
|
||
|
/// <summary>
|
||
|
/// 初始化 Kean.Domain.Order.Models.Format 类的新实例
|
||
|
/// </summary>
|
||
|
/// <param name="span">片段</param>
|
||
|
public Format(IEnumerable<string> span) => _span = span;
|
||
|
|
||
|
/// <summary>
|
||
|
/// 隐式转换为字符串
|
||
|
/// </summary>
|
||
|
/// <param name="format">格式</param>
|
||
|
public static implicit operator string(Format format) => format.ToString();
|
||
|
|
||
|
/*
|
||
|
* 重写 System.ToString 方法,实现片段到字符串的转换
|
||
|
*/
|
||
|
public override string ToString() => string.Join(string.Empty, _span.Select(i =>
|
||
|
{
|
||
|
var parts = i.Split(':', 2);
|
||
|
return parts[0] switch
|
||
|
{
|
||
|
"const" => parts[1],
|
||
|
"date" or "serial" => $"{{{parts[0]}:{parts[1]}}}",
|
||
|
_ => null,
|
||
|
};
|
||
|
}));
|
||
|
|
||
|
/// <summary>
|
||
|
/// 解释片段
|
||
|
/// </summary>
|
||
|
/// <param name="format">格式</param>
|
||
|
/// <returns>片段</returns>
|
||
|
public static IEnumerable<(string Type, string Value)> Interpret(string format)
|
||
|
{
|
||
|
var span = new Stack<StringBuilder[]>();
|
||
|
bool? flag = null;
|
||
|
foreach (var @char in format)
|
||
|
{
|
||
|
switch (@char)
|
||
|
{
|
||
|
case '{':
|
||
|
span.Push(new StringBuilder[2] { new(), new() });
|
||
|
flag = false;
|
||
|
break;
|
||
|
case ':':
|
||
|
flag = true;
|
||
|
break;
|
||
|
case '}':
|
||
|
flag = null;
|
||
|
break;
|
||
|
default:
|
||
|
switch (flag)
|
||
|
{
|
||
|
case false:
|
||
|
span.Peek()[0].Append(@char);
|
||
|
break;
|
||
|
case true:
|
||
|
span.Peek()[1].Append(@char);
|
||
|
break;
|
||
|
case null:
|
||
|
span.Push(new StringBuilder[2] { new("const"), new(@char.ToString()) });
|
||
|
flag = true;
|
||
|
break;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return span
|
||
|
.Reverse()
|
||
|
.Select(a => (a[0].ToString(), a[1].ToString()))
|
||
|
.ToArray();
|
||
|
}
|
||
|
}
|
||
|
}
|