0

我尝试根据定义的掩码创建可自定义的数字。
这是我制作面具的规则

您可以输入任何编号掩码。在此掩码中,可以使用以下标签:{000000}对应于每个客户都会递增的数字。

输入与所需的计数器长度一样多的零。

计数器将由左侧的零完成,以便具有与掩码一样多的零。

{000000+000}与之前相同,但从+first 开始应用与符号右侧数字相对应的偏移量。

{000000@x}与上一个相同,但当x达到月份时(x1 到 12 之间),计数器将重置为零。

如果使用此选项并且为 2 或更高,则还需要x序列{yy}{mm}或。{yyyy}{mm}

{dd}天(01 至 31)。

{mm}月(01 至 12)。

{yy}{yyyy}{y}超过 2、4 或 1 个数字的年份。

面具中的所有其他字符将保持不变。

不允许有空格。

2007 年 3 月 1 日创建的客户示例:
ABC{yy}{mm}-{000000}将给予ABC0701-000099
{0000+100}-ZZZ/{dd}/XXX将给予0199-ZZZ/31/XXX

所以我现在的面具是C{000000}

 <?php
    $mask = "C{000000}";
$number = 100;
    if (preg_match('/\{(0+)([@\+][0-9]+)?([@\+][0-9]+)?\}/i',$mask,$regType)){
        $masktype=$regType[1];
        $masktype_value=substr(preg_replace('/^TE_/','',$number),0,strlen($regType[1]));//get n first characters of code where n is length in mask
        $masktype_value=str_pad($masktype_value,strlen($regType[1]),"#",STR_PAD_RIGHT);
        $maskwithonlyymcode=$mask;
        $maskwithonlyymcode=preg_replace('/\{(0+)([@\+][0-9]+)?([@\+][0-9]+)?\}/i',$regType[1],$maskwithonlyymcode);
        $maskwithonlyymcode=preg_replace('/\{dd\}/i','dd',$maskwithonlyymcode);
        $maskwithonlyymcode=preg_replace('/\{(c+)(0*)\}/i',$maskrefclient,$maskwithonlyymcode);
        $maskwithonlyymcode=preg_replace('/\{(t+)\}/i',$masktype_value,$maskwithonlyymcode);
        $maskwithnocode=$maskwithonlyymcode;
        $maskwithnocode=preg_replace('/\{yyyy\}/i','yyyy',$maskwithnocode);
        $maskwithnocode=preg_replace('/\{yy\}/i','yy',$maskwithnocode);
        $maskwithnocode=preg_replace('/\{y\}/i','y',$maskwithnocode);
        $maskwithnocode=preg_replace('/\{mm\}/i','mm',$maskwithnocode);
        print "maskwithonlyymcode=".$maskwithonlyymcode." maskwithnocode=".$maskwithnocode."\n<br>";

    }

    ?>

但它不工作它正在打印

maskwithonlyymcode=C000000 maskwithnocode=C000000

我想要的输出是C000001- C000100

这段代码缺少什么?

4

1 回答 1

2

我不太了解您的代码,因此无法修复它,但是:

<?

function process_mask($mask, $number, $date)
{
    while (preg_match("/\{(.+?)\}/", $mask, $match))
    {
        $outter_code = $match[0];
        $inner_code = $match[1];
        if (preg_match("/^(0+)(\+(\d+))?$/", $inner_code, $match2))
        {
            $number2 = $number;
            if (!empty($match2[3]))
            {
                $number2 += intval($match2[3]);
            }

            $replacement = str_pad($number2, strlen($match2[1]), "0", STR_PAD_LEFT);
        }
        else
        {
            switch ($inner_code)
            {
                case "dd":
                    $replacement = date("d", $date);
                    break;
                case "mm":
                    $replacement = date("m", $date);
                    break;
                case "y":
                    $replacement = substr(date("Y", $date), 3);
                    break;
                case "yy":
                    $replacement = date("y", $date);
                    break;
                case "yyyy":
                    $replacement = date("Y", $date);
                    break;
                default:
                    trigger_error("Unrecognised code $inner_code");
                    return NULL;
            }
        }

        $mask = str_replace($outter_code, $replacement, $mask);
    }

    return $mask;
}

function test_mask($mask)
{
    $date = mktime(0, 0, 0, 4, 19, 2013);
    echo str_pad($mask, 25)." => ".process_mask($mask, 100, $date)."\n";
}

test_mask("C{000}");
test_mask("C{000000}");
test_mask("C{000000+10}");
test_mask("ABC{yy}{mm}-{000000}");
test_mask("{0000+100}-ZZZ/{dd}/XXX");

?>

输出:

C{000}                    => C100
C{000000}                 => C000100
C{000000+10}              => C000110
ABC{yy}{mm}-{000000}      => ABC1304-000100
{0000+100}-ZZZ/{dd}/XXX   => 0200-ZZZ/19/XXX

我绝对不了解您有关重置计数器的规则。您想根据什么日期重置数字?当前日期?您是否为每个客户保留一些柜台(您还没有解释是什么number)?为什么要在某个月份重置它?间隔重置不是更有意义吗?就像每个月一样(在实现方面,每个月保持单独的计数器是有意义的,这样格式化逻辑与当前时间无关)。一些例子可能有助于理解这一点。

同样对于日期格式,我建议您坚持使用 PHPdate格式,不要自己发明。

我建议你改用这样的模式(它实际上有点像.NET):

{(#[+offset]|php-date-format-string)[:length]}

所以(对于数字 = 999 和日期 = 2013-04-19):

C{#:4}        => C0999
C{#+10:4}     => C1009
C{#:6}        => C000999
C{#:4}/{Y}    => C0999/2013
C{#:4}/{Y:4}  => C0999/2013
C{#:4}/{Y:2}  => C0999/13
C{#:4}/{Y:1}  => C0999/3
C{#:4}/{m}    => C0999/03
C{#:4}/{Y}{m} => C0999/201303
C{#:4}/{Ym}   => C0999/201303

用于此的代码将更简单、更可扩展和更灵活。

于 2013-04-19T12:34:26.300 回答