How to finish a Quaternion.Euler rotation when you let go of the input?

I am trying to make my character flip like in Paper Mario. When I let go of the input key, the lerping stops, so basically my question is how to “finish” lerping when a key is let go of. This is my flipping/moving code.

void Start()
{
playerRb = this.GetComponent();
playerTr = this.GetComponent();
}

void FixedUpdate()
{
    playerRb.velocity = new Vector2(Mathf.Lerp(0, Input.GetAxis("Horizontal") * moveSpeed, 0.4f), Mathf.Lerp(0, Input.GetAxis("Vertical") * moveSpeed, 0.4f));

    if (Input.GetKey(KeyCode.D) && playerTr.rotation.y != 0)
    {
        PlayerRotator(0);
    }

    if (Input.GetKey(KeyCode.A) && playerTr.rotation.y != 180)
    {
        PlayerRotator(180);
    }        
}

void PlayerRotator(int angle)
{
    playerTr.rotation = Quaternion.Lerp(playerTr.rotation, Quaternion.Euler(transform.rotation.x, angle, transform.rotation.z), rotSpeed);
}

Your first option would be to do something like this:

[Header("Speed of the character")]
[SerializeField] private float moveSpeed;
[Header("Time taken to complete a full rotation")]
[SerializeField] private float lerpTime;

private bool isFlippingSprite;
private float currentLerpTime;
private int angle;
private Rigidbody2D playerRb;

void Start()
{
    playerRb = GetComponent<Rigidbody2D>();
}

private void Update()
{
    if (isFlippingSprite)
    {
        //increment timer once per frame
        currentLerpTime += Time.deltaTime;
        if (currentLerpTime > lerpTime)
        {
            currentLerpTime = lerpTime;
        }

        //lerp!
        float perc = currentLerpTime / lerpTime;
        transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(transform.rotation.x, angle, transform.rotation.z), perc);

        // lerp complete
        if (perc >= 1)
            isFlippingSprite = false;
    }
}

void FixedUpdate()
{
    playerRb.velocity = new Vector2(Mathf.Lerp(0, Input.GetAxis("Horizontal") * moveSpeed, 0.4f), Mathf.Lerp(0, Input.GetAxis("Vertical") * mo

    ¨// we are already flipping so disregard this
    // call until we are done flipping
    if (isFlippingSprite)
        return;

    if (Input.GetKey(KeyCode.D))
    {
        PlayerRotator(0);
    }
    if (Input.GetKey(KeyCode.A))
    {
        PlayerRotator(180);
    }
}

void PlayerRotator(int a)
{
    angle = a;
    isFlippingSprite = true;
    currentLerpTime = 0;
}

The problem here is that you cannot flip while already flipping, to solve that we could do something like this:

[Header("Speed of the character")]
[SerializeField] private float moveSpeed = 10;
[Header("Time taken to complete a full rotation")]
[SerializeField] private float lerpTime = 0.5f;

private bool isFlippingSprite;
private float currentLerpTime;
private int angle;
private Rigidbody2D playerRb;

void Start()
{
    playerRb = GetComponent<Rigidbody2D>();
}

private void Update()
{
    if (isFlippingSprite)
    {
        //increment timer once per frame
        currentLerpTime += Time.deltaTime;
        if (currentLerpTime > lerpTime)
        {
            currentLerpTime = lerpTime;
        }

        //lerp!
        float perc = currentLerpTime / lerpTime;
        transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(transform.rotation.x, angle, transform.rotation.z), perc);

        // lerp complete
        if (perc >= 1)
            isFlippingSprite = false;
    }
}

void FixedUpdate()
{
    playerRb.velocity = new Vector2(Mathf.Lerp(0, Input.GetAxis("Horizontal") * moveSpeed, 0.4f), Mathf.Lerp(0, Input.GetAxis("Vertical") * mo

    if (Input.GetKey(KeyCode.D))
    {
        PlayerRotator(0);
    }
    if (Input.GetKey(KeyCode.A))
    {
        PlayerRotator(180);
    }
}

void PlayerRotator(int a)
{
    if (!isFlippingSprite || currentLerpTime > (lerpTime / 2))
    { 
        angle = a;
        isFlippingSprite = true;
        currentLerpTime = 0;
    }
}

That way we can interrupt the lerp if we are at least halfway through, you can adjust to your liking what to divide by.

result:

161022-ezgifcom-video-to-gif.gif